python m引發的對模組的認識

2022-03-26 18:33:04 字數 2134 閱讀 4870

python -m : 以模組的方式執行

在檔案內部,我們一般通過下面的**來區分當前指令碼,是作為模組匯入,還是作為指令碼直接執行。

if__name__ == '

__main__':

print('

模組直接執行');

當檔案作為指令碼直接執行時,這段**會產生***,輸出字串「模組直接執行」;

當檔案作為模組被匯入時,不會產生***,不輸出字串「模組直接執行」;

回到正題,當我們知道乙個模組的名字,但不知道它的路徑時,我們可以通過-m 引數,在 shell 中將該模組當作指令碼執行,例如:

python -m module_name

事實上,如果我們知道模組的完整路徑(此處假設為

"/path/to/module.py

"),上述命令的效果,以下面的命令等同

python /path/to/module.py

有無 -m 引數的比較

1. python script.py #

直接執行指令碼

2. python -m script.py #

當做模組的方式執行,相當於 import

一般情況下,我們會想當然的認為,有無引數 -m 對程式會有不同的影響,但是很可惜,第二種寫法是會在程式執行之後報錯的。其正確的寫法是:丟掉 .py 字尾。

首先直觀的觀察執行結果,python 的版本是 3.6.3。

編寫 script.py 指令碼,內容如下:

import

sysprint

(sys.path)

print

(sys.modules)

直接執行指令碼

$ python script.py['

/home/ossifrage/workspaces/python-m

', '

/usr/lib/python36.zip

', '

/usr/lib/python3.6

', ...]

當做模組方式執行

$ python -m script

['', '

/usr/lib/python36.zip

', '

/usr/lib/python3.6

', ...]

顯示的內容還有很多,只突出顯示出了不同的地方。

通過比較不同的地方,我們發現:

第一種方法——直接執行指令碼,當前指令碼所在的路徑會加入到 sys.path 列表中,但是 sys.modules 字典中的

__main__

的路徑不是絕對路徑,只是指令碼名稱。

第二種方法——當做模組方式執行,當前指令碼所在的路徑不會加入到 sys.path 列表中,但是 sys.modules 字典中的

__main__

的路徑是絕對路徑,同時,還引入了

runpy 和 pkgutil 兩個模組。

runpy 的用途:定位並執行該模組。主要用途在於實現命令列-m 執行 python 模組的效果。pkgutil 的用途:獲取包裡面的所有模組列表。pkgutil.get_data() 可讀取包內任何檔案內容。

模組的匯入機制

其實,上面的內容涉及到了 python 包模組的匯入機制。

要理解模組的匯入機制,得理解幾個關鍵的名詞。sys.path -> sys.modules -> < module >.__dict__

sys.modules:是乙個字典。所有載入到記憶體中的模組都存放在該字典中。當

import 乙個模組的時候,首先會在這個字典中查詢是否已經載入了目標模組。

如果已載入,則將模組的名字加入到正在呼叫 import 的模組的 local 命名空間(也就是< module >.__dict__

)中。如果沒有,則從 sys.path 查詢,找到後載入記憶體,

並加入到 sys.modules 字典,名稱也將匯入到當前模組的 local 命名空間。

另外有關模組匯入的知識:

對min max width height的認識

在css世界中,提出了min max weight的應用場景 自適應布局或者是流式布局中才會出現,從最小和最大上面我們知道他們是具有邊界行為的屬性。在現在的pc端開發中,為了適應各種不同解析度的顯示屏,min max width就會起到很關鍵的作用。應用場景 下面列舉乙個自己遇到的小情況 電腦解析度...

由ArrayList引發的關於淺拷貝的認知誤區

首先,無論深拷貝還是淺拷貝,拷貝的結果,都是乙個新的物件!但是,淺拷貝對於二級目錄中引用型別,都是直接拷貝引用,而非開闢新記憶體。arraylist是淺拷貝的。這裡的淺拷貝,指的是 arraylist拷貝的結果,是乙個新的arraylist,但是新arraylist中的成員,都是老arraylist...

對FileStream的幾種屬性和方法認識

filestream物件表示在磁碟或網路路徑上指向檔案的流。這個類提供了在檔案中讀寫位元組的方法,使用filestream能夠對對系統上的檔案進行讀 寫 開啟 關閉等操作。並對其他與檔案相關的作業系統提供控制代碼操作,如管道,標準輸入和標準輸出。讀寫操作可以指定為同步或非同步操作。filestrea...