系統模組呼叫
說到模組呼叫,大家應該都對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,則直接使...