首頁 > 軟體

python 中的 module 和 package

2022-04-14 19:00:36

接著如何在python 中匯入 package的分享,這一次是在 package 下繼續巢狀一個 package ,

專案目錄如下:

pkg1
---__init__.py
---mod1.py
------pkg2
---------__init__.py
---------mod2.py
import pkg1.pkg2.mod2

我們嘗試將 mod2 進行匯入,這一次將先匯入 pkg1 然後 pkg2 最後匯入 mod2

import pkg1
import pkg2
import mod2

從輸出上來看,我們發現 mod1 並沒有自動被匯入進來。

import pkg1.pkg2.mod2

pkg1.pkg2.mod2.say_hi()

我們通過pkg1.pkg2.mod2.say_hi()來存取 mod2 中 say_hi 函數。

print('pkg1' in sys.modules)#True
print('pkg1.pkg2' in sys.modules)#True
print('pkg1.pkg2.mod2' in sys.modules)#True

通過給匯入 module 起一個別名方式來快捷地存取 mod2 module 物件的屬性。python 會自動執行可以存取到 mod2 經過的 package ,通過輸出不難發現這些 package 已經被匯入,並新增到了 sys.modules 快取中。

import pkg1.pkg2.mod2 as mod2

mod2.say_hi()
pkg1
---__init__.py
---mod1.py
------pkg2
---------__init__.py
---------mod2.py
main.py

在 pkg1 package 下 __init__.py

import pkg1.pkg2.mod2
print("import pkg1")

這我們在 pkg1 package 下的 __init__.py 檔案匯入 mod2 module 是絕對路徑 pkg1.pkg2.mod2。表示我們執行 __init__.py 檔案是在 pkg1 外面執行,所以路徑中也包含了 pkg1,對於這個 project 來說,main.py 是入口檔案,要執行這個專案,我們只需要執行資料夾下 main.py 檔案即可。pkg1 和 main.py 位於同一個目錄級別,任何子模組(sub-module)都是

import pkg1.pkg2.mod2 as mod2

mod2.say_hi()

為了解釋我們進一步說明,我們再去建立一個專案,專案下放兩個

main.py
my_mod.py
import socket
x=2
def say_hi():
    print("say hi from my mod")

在 main.py 程式碼如下

import my_mod as mod

print(mod.x)
print(mod.socket.gethostname())

從而我們知道,我們在 main.py 匯入 my_mod 作為,然後在 my_mod 檔案匯入 socket module 可以通過 mod.socket 匯入。

server
---app.py

這裡我們 app.py 裡只新增了一個語句,在終端輸出

print("running app")

在 python 中,可以在目錄下搜尋指定的檔案並執行,python 直譯器提供 -m 引數可以讓我們指定module 名稱來執行一個 python module 檔案,所以可以通過下面語句來執行 server 資料夾下的 app.py 檔案。

python -m server.app

python 會在 sys.path 路徑搜尋 `server/app.py

我們也可以將 server 下的 app.py 重新命名為 __main__.py 如下

server
---__main__.py

這樣就可以直接通過 python -m server 語句來執行 server package 下的 __main__.py 檔案。當然我們可以同時在 server package 建立一個 __init__.py 和 __main__.py 兩個檔案。

到此這篇關於 python 中的 module 和 package 的文章就介紹到這了,更多相關 module 和 package 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com