如何通過命令列執行 Python 腳本檔案,模組,套件
本節講述的是通過命令列執行以檔案,模組或套件形式存在的 Python 腳本,至於如何執行程式碼,你可以檢視如何通過命令列執行 Python 程式碼一節。
執行 Python 腳本檔案的命令
針對不同的作業系統,你可以在命令列中輸入python
或python3
(或者指向 Python 的一些別名),並給出包含 Python 腳本檔案的路徑以執行他們。
python <script>
python3 <script>
- script 參數
script
參數可以是相對路徑或絕對路徑,他指向副檔名為py
的 Python 檔案,或一個包含__main__.py
檔案的資料夾,或包含__main__.py
的zip
壓縮檔案。
通過命令列執行 Python 腳本檔案
將script
參數取代為某個包含 Python 程式碼的py
檔案,會讓該腳本檔案得以執行。事實上,Python 對需要執行檔案的副檔名沒有強製性要求,因此,允許py
以外的副檔名,比如txt
(文字檔案)。
下面是一個用於演示的 Python 腳本檔案run.py
,我們使用函式print
和內建變數__file__
來顯示檔案路徑。
# 在命令列輸入 python 或 python3,並給出 run.py 的相對或絕對路徑,以執行 print 函式
print(f'我被執行了?{__file__}')
控製命令列跳躍至檔案run.py
所在的目錄,然後輸入以下內容,檔案中的 Python 程式碼將被執行。
python run.py
我被執行了?…\command_line\run.py
python3 run.py
我被執行了?…/command_line/run.py
通過命令列執行包含 Python 腳本檔案 __main__.py 的 zip 檔案或資料夾
如果script
參數指向一個zip
檔案或資料夾,並且zip
檔案根目錄或資料夾包含特殊 Python 腳本檔案__main__.py
,那麽腳本檔案__main__.py
將被執行,否則,你會取得類似於can't find '__main__' module in '…'
這樣的提示資訊。
Python 僅支援執行 zip 格式的壓縮檔案
無論壓縮檔案的副檔名是什麽,他應該是zip
格式的。其余壓縮格式,比如7z
,gzip
,tar
等,無法被 Python 正確執行,即便他們包含特殊的 Python 腳本檔案__main__.py
。
下面,我們準備了兩個不同的__main__.py
檔案,分別放入資料夾run
和位於資料夾zip
的壓縮檔案run.zip
中,資料夾run
與資料夾zip
位於同一目錄。
# 在命令列輸入 python 或 python3,並給出 run 資料夾的相對或絕對路徑,以執行 print 函式
print(f'__main__ 被執行了?{__file__}')
# 在命令列輸入 python 或 python3,並給出 run.zip 的相對或絕對路徑,以執行 print 函式
print(f'zip 被執行了?{__file__}')
控製命令列跳躍至資料夾run
和zip
所在的目錄,然後輸入以下內容,資料夾run
和檔案run.zip
中包含的__main__.py
將被執行。
python run
__main__ 被執行了?…\command_line\run\__main__.py
python3 run
__main__ 被執行了?…/command_line/run/__main__.py
python zip\run.zip
zip 被執行了?…\command_line\zip\run.zip\__main__.py
python3 zip/run.zip
zip 被執行了?…/command_line/zip/run.zip/__main__.py
執行 Python 模組,套件的命令
由於每一個py
腳本檔案都是一個 Python 模組,因此,以上描述的執行 Python 腳本檔案可以被視為執行 Python 模組。這裏,我們將介紹另一種方式,通過在命令列輸入python
或python3
(或者指向 Python 的一些別名)並使用-m
參數來執行 Python 模組或套件。
python -m <module-name>
python3 -m <module-name>
- module-name 參數值
module-name
參數值是 Python 模組或套件的完整名稱(不需要在末尾書寫.py
),他可能因為 Python 模組搜尋路徑的改變而改變。
模組
想要了解模組的完整名稱,你可以檢視Python 指南的Python 模組的完整名稱一段。
通過命令列執行 Python 模組
如果module-name
參數值給出的完整名稱對應了一個 Python 模組,那麽該 Python 模組將被執行,在大部分情況下,其效果與直接執行模組對應的py
腳本檔案是一致的。由於在命令列中直接執行py
腳本檔案與通過-m
參數執行 Python 模組,可能會獲得不同的 Python 模組搜尋路徑,因此存在模組無法被定位的可能性。
模組搜尋路徑
想要了解-m
參數對應的模組搜尋路徑,你可以檢視Python 指南的Python 腳本目錄或目前目錄一段。
命令列 -m 參數表示的 Python 模組完整名稱可以包含某些特殊字元
在正常的 Python 程式碼中,模組的完整名稱不能包含某些特殊字元,即使這些字元可以出現在檔案系統的路徑中,比如-
,如果 Pythonpy
腳本檔案或相關資料夾的名稱包含字元-
,那麽書寫import all-words.all-verbs
這樣的匯入陳述式是不可能的,因為-
將導致語法錯誤。
-m
參數對 Python 模組完整名稱並沒有強製性要求,你可以書寫類似於完整名稱的路徑,比如包含字元-
的路徑,原因在於這並不像書寫 Python 程式碼一樣涉及語法問題。
在名稱包含-
的資料夾all-words
中,我們建立一個名稱包含-
的 Python 腳本檔案all-verbs.py
,並為其編寫程式碼。
# 在命令列輸入 python -m 或 python3 -m,並給出 all-verbs 的“完整名稱”,以執行 print 函式
print('這裏是模組 all-verbs')
控製命令列跳躍至資料夾all-words
所在的目錄,然後輸入以下內容,Python 腳本檔案all-verbs.py
將作為模組被執行。
python -m all-words.all-verbs
這裏是模組 all-verbs
python3 -m all-words.all-verbs
這裏是模組 all-verbs
通過命令列 -m 參數執行的 Python 模組需要具有對應的 py 腳本檔案或 pyc 位元組碼檔案
需要指出的是,能夠通過-m
參數執行的 Python 模組需要具有對應的py
腳本檔案,或者編譯後的pyc
位元組碼檔案。因此,執行某些內建 Python 模組將是不可行的,比如常見的sys
內建模組。
python -m sys
…: No code object available for sys
python3 -m sys
…: No code object available for sys
通過命令列執行包含模組 __main__ 的 Python 套件
在 Python 3.1 或更高版本中,你可以將某個 Python 套件的完整名稱指派給module-name
,以執行該 Python 套件中的__main__
模組。在 Python 3.4 或更高版本中,上述做法對於命名空間套件(不包含__init__
模組的 Python 套件)同樣有效。當被執行的 Python 套件中缺少模組__main__
時,你會取得類似於No module named ….__main__; '…' is a package and cannot be directly executed
這樣的提示資訊。
通過-m
參數執行 Python 套件,與執行包含__main__.py
檔案的zip
壓縮檔案或資料夾類似,但他們可能會對應不同的 Python 模組搜尋路徑,這樣的情況,我們在之前執行 Python 模組一段中討論過。
另外,由於 Python 套件是一種特殊的模組,因此,一些關於執行 Python 模組的問題,同樣適用於執行 Python 套件。比如,包含字元-
的“完整名稱”。
下面,我們在all-words
資料夾中,建立 Python 腳本檔案__main__.py
,並為其編寫程式碼。
# 在命令列輸入 python -m 或 python3 -m,並給出 all-words 的“完整名稱”,以執行 print 函式
print('這裏是 all-words 的 __main__ 模組')
控製命令列跳躍至資料夾all-words
所在的目錄,然後輸入以下內容,__main__
模組將被執行。
python -m all-words
這裏是 all-words 的 __main__ 模組
python3 -m all-words
這裏是 all-words 的 __main__ 模組
執行 Python 編譯的 pyc 位元組碼檔案
在以上介紹的幾種執行方式中,py
檔案可被取代為編譯後的pyc
位元組碼檔案。比如,將名稱為__main__.pyc
的 Python 位元組碼檔案放入資料夾或zip
壓縮檔案中,以取代原有的__main__.py
。
並非執行 __pycache__ 資料夾中編譯的 pyc Python 位元組碼檔案
需要指出,這裏所說的執行pyc
,並不是指 Python 自動執行編譯在__pycache__
資料夾中的位元組碼檔案,而是直接通過命令列執行pyc
。
在使用py_compile
模組將run.py
編譯為pyc
檔案後,控製命令列跳躍至pyc
檔案所在的目錄,輸入命令以執行他。這裏,我們假設編譯的 Python 位元組碼檔案的名稱為run.pyc
。
python run.pyc
我被執行了?…\command_line\run.pyc
python3 run.pyc
我被執行了?…/command_line/run.pyc
Python py 腳本檔案與 pyc 位元組碼檔案的執行優先順序
如果你所執行的命令沒有明確指出對格式的要求,比如通過-m
參數執行,並且在資料夾或zip
壓縮檔案中,存在名稱相同的 Pythonpy
腳本檔案和pyc
位元組碼檔案(不是__pycache__
資料夾中的),那麽 Python 將預設優先執行py
腳本檔案,編譯的 Pythonpyc
位元組碼檔案會被忽略。
程式碼
講解影片
如何在命令列或終端機執行 Python 腳本檔案,包含 __main__.py 腳本檔案的資料夾或 zip 壓縮檔案·YouTube