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)
(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...