python模塊導入

最近遇到了很多關于python模塊導入的問題,這里記錄一下

一個 module 內的 Python 代碼通過 importing 操作就能夠訪問另一個模塊內的代碼。 import 語句是發起調用導入機制的最常用方式,但不是唯一的方式。 importlib.import_module() 以及內置的 __import__() 等函數也可以被用來發起調用導入機制。

關鍵字

使用all = ['','']

name

name 是一個全局變量,代表模塊的名字,即命名空間。

Python有一個經典的判斷語句 if name == main:,當Python文件被當做腳本直接執行時,name變量的值會變為main,從而使該判斷語句成立,并執行該語句下的其他代碼; 而當Python文件被當做模塊/包導入時,它的值表示的是模塊名.

import

import關鍵字是Python中用來導包的,常見的import語句有四種:
1.import module: 這種形式會導入module下所有文件,如果module下有很多模塊,而你并沒有全部用到,顯然會浪費很多內存(加載代碼)。

2.from module import sub_module/func:這種形式是導入module下的某個子模塊,或者定義的某個函數,因為只是導入我們需要的模塊,所以并不會像第一種方式很浪費內存,也推薦這種方式。

3.from module import sub_module/func as new_module:這種形式與第二種形式差不多,但是可以使用我們自定義的名稱,看個人需求。

4.from module import *:這種形式也是導入module下所有文件,不同于第一種,這種不需要加上module前綴。舉個例子,比如module下有個test函數,第一種方式是這樣的module.test();而第四種方式是這樣的test()。

sys.path

一個由字符串組成的列表,用于指定模塊的搜索路徑。初始化自環境變量 PYTHONPATH,再加上一條與安裝有關的默認路徑。

sys.path 是一個列表,它的作用是存儲Python模塊的搜索路徑。一般情況下,該變量存儲的路徑有當前路徑,內置模塊路徑等。

我們經常報模塊找不到,很大程度可以通過設置sys.path變量來解決。

命令行參數

在Python的模塊導入中,還有兩個命令行參數也被多次提到,分別是 -c-m。
python -c:傳遞一個字符串形式的Python程序,并執行

python -c "import sys; print(sys.path)"

python -m:將一個Python模塊當成腳本使用,具體可以參見這篇文章

sys.moudles

sys.modules是一個全局字典,該字典是python啟動后就加載在內存中。每當程序員導入新的模塊,sys.modules都將記錄這些模塊。字典sys.modules對于加載模塊起到了緩沖的作用。當某個模塊第一次導入,字典sys.modules將自動記錄該模塊。當第二次再導入該模塊時,python會直接到字典中查找,從而加快了程序運行的速度。

import()

import(name, globals=None, locals=None, fromlist=(), level=0)

該函數會導入 name 模塊,有可能使用給定的 globalslocals 來確定如何在包的上下文中解讀名稱。 fromlist 給出了應該從由 name 指定的模塊導入對象或子模塊的名稱。 標準實現完全不使用其 locals 參數,而僅使用 globals 參數來確定 import 語句的包上下文。
level 指定是使用絕對還是相對導入。 0 (默認值) 意味著僅執行絕對導入。 level 為正數值表示相對于模塊調用 __import__() 的目錄,將要搜索的父目錄層數 (詳情參見 PEP 328)。
name 變量的形式為 package.module 時,通常將會返回最高層級的包(第一個點號之前的名稱),而 不是name 命名的模塊。 但是,當給出了非空的 fromlist 參數時,則將返回以 name 命名的模塊。

importlib.import_module

importlib.import_module(name, package=None)
導入一個模塊。參數 name 指定了以絕對或相對導入方式導入什么模塊 (比如要么像這樣 pkg.mod 或者這樣 ..mod)。如果參數 name 使用相對導入的方式來指定,那么那個參數 packages 必須設置為那個包名,這個包名作為解析這個包名的錨點 (比如 import_module('..mod', 'pkg.subpkg') 將會導入 pkg.mod)。

import_module() 函數是一個對 importlib.__import__() 進行簡化的包裝器。 這意味著該函數的所有主義都來自于 importlib.__import__()。 這兩個函數之間最重要的不同點在于 import_module() 返回指定的包或模塊 (例如 pkg.mod),而 __import__() 返回最高層級的包或模塊 (例如 pkg)。

如果動態導入一個自從解釋器開始執行以來被創建的模塊(即創建了一個 Python 源代碼文件),為了讓導入系統知道這個新模塊,可能需要調用 invalidate_caches()

在 3.3 版更改: 父包會被自動導入。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容