Python模組 跨目錄 呼叫總結

2021-10-07 02:25:21 字數 4387 閱讀 4216

系統模組呼叫

說到模組呼叫,大家應該都對import有個基本的了解,在專案裡面非常常見的比如import time,from selenium import webdriver等,我們經常在python中通過from…import…/import…的語法可以引用一些系統模組,把系統模組引入後就可以呼叫模組裡面定義好的方法,例如:

from time import ctime

print ctime()

import time

print time.ctime()

上面兩個寫法的最終目的都是為了獲取並列印當前時間,

方法一中通過引入time模組,匯入其下面的ctime方法,實現對ctime()方法的呼叫,因為用了from,指定了所需呼叫下面具體的ctime方法,在用的時候直接寫方法名ctime()就可以呼叫了,

方法二裡面是直接引入了整個time模組,在用的時候需要加入模組名再進行其下面方法的引用time.ctime()。

自定義模組呼叫

我們在進行編碼設計的時候,往往需要自定義一些模組,其他程式可以呼叫這些模組,那麼方法和原理還是和上面的系統模組呼叫是差不多的,讓我們來舉個栗子:

先建立乙個目錄modpython,下面定義乙個公共模組publica.py ,為了更好的理解,我都是寫的簡單的方法的栗子。

#publica.py

def puba():

print 「i』m publica in /modpythonh/publica.py」

接下來,還是在這個目錄下新建乙個python程式a.py去呼叫這個自定義的模組

#a.py

import publica

publica.puba()

執行a.py的結果如下:

i am def puba_1 in /modpythonh/publica.py

[finished in 1.1s]

結果成功地列印了publica.py裡面的puba()方法,說明這次呼叫成功了~

讓我們來看看剛剛這個目錄結構,因為publica和a這兩個指令碼都是在modpython裡面的,所以直接用import引用進來就好了:

modpython/

-------------/ publica.py

-------------/a.py

這個時候如果我們在modpython這個專案裡新建乙個資料夾b,裡面新建乙個b1.py和b2.py兩個檔案,目錄和具體內容如下:

modpython/

-------------/ publica.py

-------------/a.py

-------------/b

-------------/b                  /b1.py

-------------/b                  /b2.py

#b1.py

def b1_1():

print 「i am def b1_1 in /modpythonh/b/b1.py」

def b1_2():

print 「i am def b1_2 in /modpythonh/b/b1.py」

#b2.py

def b2_1():

print 「i am def b2_1 in /modpythonh/b/b2.py」

def b2_2():

print 「i am def b2_2 in /modpythonh/b/b2.py」

這個時候我們在a.py中import b1,然後b1.b1_1(),試試能不能成功……

這個時候報錯了:importerror: no module named b1,提示說沒有b1這個模組,為什麼呢,因為b1和執行程式a.py不在乙個目錄下,所以查詢不到,這個時候該怎麼解決,下面,咳咳(敲黑板(o゚v゚)ノ)重點請看……

python跨目錄的模組呼叫

繼續用上面已經建好的目錄,然後繼續按下面的規則來點更複雜的,建好了我們再依次來說說不同情況的跨目錄模組呼叫……modpython/

-------------/a.py

-------------/publica.py

-------------/b /b1.py

-------------/b /b2.py

-------------/c /c.py

在modpython裡面再建資料夾c,裡面新建乙個c.py檔案,檔案建好了,那我們就來具體分情況說說吧。

同級目錄下子檔案呼叫

在我們檔案結構中,與a.py同級的有publica.py還有就是b、c目錄了,那麼對於a.py來說,b1、b2、c就是子檔案了。

如果我們想要在a.py裡面呼叫b1,需要怎麼做呢?

如果直接進行import b1,上面試過了會報錯,找不到模組b1,因為b1和a不再乙個目錄下。

那麼我們就找到b1的父級目錄b,b和和a.py在乙個目錄下,將b作為乙個模組,b1、b2都作為模組裡面的方法去呼叫,為了讓系統知道b是乙個模組,我們需要在b下面新建乙個叫做__init__.py的檔案,內容可以為空,這個檔案可以告訴python b是乙個可以呼叫的模組了。

-------------/b /init.py

建好後我們再到a.py中來呼叫 執行一下:

from b import b1,b2

b1.b1_1()

b2.b2_2()

執行結果:

i am def b1_1 in /modpythonh/b/b1.py

i am def b2_2 in /modpythonh/b/b2.py

這樣就沒有問題啦,我們再來補充一下另外兩種寫法也是可以的:

#a.py

from b.b1 import *

b1_1()

#a.py

import b.b1

b.b1.b1_1()

上面的三種方法都是基於__init__.py檔案是空的時候,我個人比較喜歡第一種,但是問題來了,如果b下面有很多的檔案,我每次呼叫可能需要的是不同的方法,能不能在每次呼叫的時候直接寫:

from b import *

#init.py

import b1,b2

這樣就能夠直接寫import * 啦。

同級目錄之間的跨模組呼叫

modpython

---------/a.py

---------/publica.py

---------/b /init.py

---------/b /b1.py

---------/b /b2.py

---------/c /c.py

我們再來看這個目錄結構,梳理一下,對於b、c來說他們是同級的,b1和c也是同級的,如果我們需要在c裡面呼叫b該怎麼做呢?如果像之前a.py呼叫的那樣,還是會出現這個眼熟的error:importerror: no module named b,匯入的是b模組,而b和c.py檔案也不是在乙個目錄下的了,如果需要那樣呼叫,那麼就要先回到上級目錄c,再開始from b import b1

跳轉目錄這個操作,我們需要呼叫python的sys模組進行實現,具體實現方法如下:

再來看我們這個栗子,c.py回到上一級就是c這個目錄了,對於c來說,和b就是同級目錄,b下面已經建立了__init__.py檔案,已經是個模組可以用來引入,這個時候from b  import b1就沒有問題可以順利呼叫啦。

了解到這裡,關於python跨目錄呼叫自定義模組的問題基本就得以解決了,實在不行,還有乙個萬能的方法(偷笑(/▽\)):

關於.pyc檔案的一點理解

在上述的各種自定義模組呼叫的操作後,如果回到之前新建的目錄再多看一眼,相信不難發現,多出了幾個.pyc檔案,比如上面的b1.pyc、init.pyc,為什麼會生成這些pyc檔案,pyc檔案又是有什麼作用呢,我查閱了點資料在此說一下我的理解。

首先,來看一下python的執行和編譯機制的幾個步驟:

python執行自然要依賴直譯器,直譯器會將python原始碼轉換為位元組碼,然後再執行轉換好的位元組碼。

那麼當我們在引入呼叫一些模組時……

模組載入的過程中,原始碼就被虛擬機器(直譯器)翻譯成了pycodeobject物件(也就是位元組碼)

將pycodeobject寫入了cpu,下次執行將直接從記憶體中進行讀取指令並執行程式

執行結束後,根據執行的方式決定是否將執行的結果寫回硬碟,也就是複製到.pyc檔案中

當再次執行時,先檢查是否有.pyc檔案,有的話,再檢查位元組碼檔案與自身的修改時間是否一致,一致則直接執行.pyc檔案,不一致或是沒有位元組碼檔案則從新執行前面三個 步驟。

所以,我們前面呼叫過的模組都有生成乙個.pyc檔案。

從上面的步驟進行分析,就可以看出.pyc檔案相對與.py檔案來說,由於是執行過並寫入記憶體空間的,所以載入速度會比.py檔案要快,可以加速程式的執行。

0013跨目錄模組呼叫

在乙個目錄中呼叫模組和類 模組student的students類 class students def init self,name,city self.name name self.city city print my name is s and come from s name,city def...

python跨目錄呼叫

本文介紹pyhton的跨目錄呼叫問題。在python中有時候我們需要呼叫另一.py檔案中的方法或者類。如果該.py檔案與當前檔案位於同一目錄下那麼問題非常容易解決。如果兩個.py檔案位於不同的目錄下就比較麻煩。下面分別介紹如下 1.兩個.py檔案位於同一目錄下 假設兩個.py檔案分別為test1.p...

python跨目錄引用模組

最近學習python,匯入模組的時候遇到了一些問題,通過查詢資料解決。做一些必要的筆記,一來是對自己學習的知識的鞏固,二來對有同樣問題的人有參考作用 一 跨目錄呼叫模組 1 呼叫同級目錄下的模組 目錄結構 src mod1.py test1.py 若在程式test1.py中匯入模組mod1,則直接使...