如何通過命令列執行 Python 腳本檔案,模組,套件

    閱讀 11:28·字數 3444·更新 
    Youtube 頻道
    訂閱 130

    本節講述的是通過命令列執行以檔案,模組或套件形式存在的 Python 腳本,至於如何執行程式碼,你可以檢視如何通過命令列執行 Python 程式碼一節。

    執行 Python 腳本檔案的命令

    針對不同的作業系統,你可以在命令列中輸入pythonpython3(或者指向 Python 的一些別名),並給出包含 Python 腳本檔案的路徑以執行他們。

    Windows
    python <script>
    UNIX/Linux/macOS
    python3 <script>
    script 參數

    script參數可以是相對路徑或絕對路徑,他指向副檔名為py的 Python 檔案,或一個包含__main__.py檔案的資料夾,或包含__main__.pyzip壓縮檔案。

    通過命令列執行 Python 腳本檔案

    script參數取代為某個包含 Python 程式碼的py檔案,會讓該腳本檔案得以執行。事實上,Python 對需要執行檔案的副檔名沒有強製性要求,因此,允許py以外的副檔名,比如txt(文字檔案)。

    下面是一個用於演示的 Python 腳本檔案run.py,我們使用函式print和內建變數__file__來顯示檔案路徑。

    run.py
    # 在命令列輸入 python 或 python3,並給出 run.py 的相對或絕對路徑,以執行 print 函式
    print(f'我被執行了?{__file__}')

    控製命令列跳躍至檔案run.py所在的目錄,然後輸入以下內容,檔案中的 Python 程式碼將被執行。

    Windows
    python run.py
    我被執行了?\command_line\run.py
    UNIX/Linux/macOS
    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格式的。其余壓縮格式,比如7zgziptar等,無法被 Python 正確執行,即便他們包含特殊的 Python 腳本檔案__main__.py

    下面,我們準備了兩個不同的__main__.py檔案,分別放入資料夾run和位於資料夾zip的壓縮檔案run.zip中,資料夾run與資料夾zip位於同一目錄。

    run/__main__.py
    # 在命令列輸入 python 或 python3,並給出 run 資料夾的相對或絕對路徑,以執行 print 函式
    print(f'__main__ 被執行了?{__file__}')
    zip/__main__.py
    # 在命令列輸入 python 或 python3,並給出 run.zip 的相對或絕對路徑,以執行 print 函式
    print(f'zip 被執行了?{__file__}')

    控製命令列跳躍至資料夾runzip所在的目錄,然後輸入以下內容,資料夾run和檔案run.zip中包含的__main__.py將被執行。

    Windows
    python run
    __main__ 被執行了?\command_line\run\__main__.py
    UNIX/Linux/macOS
    python3 run
    __main__ 被執行了?/command_line/run/__main__.py
    Windows
    python zip\run.zip
    zip 被執行了?\command_line\zip\run.zip\__main__.py
    UNIX/Linux/macOS
    python3 zip/run.zip
    zip 被執行了?/command_line/zip/run.zip/__main__.py

    執行 Python 模組,套件的命令

    由於每一個py腳本檔案都是一個 Python 模組,因此,以上描述的執行 Python 腳本檔案可以被視為執行 Python 模組。這裏,我們將介紹另一種方式,通過在命令列輸入pythonpython3(或者指向 Python 的一些別名)並使用-m參數來執行 Python 模組或套件。

    Windows
    python -m <module-name>
    UNIX/Linux/macOS
    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,並為其編寫程式碼。

    all-words/all-verbs.py
    # 在命令列輸入 python -m 或 python3 -m,並給出 all-verbs 的“完整名稱”,以執行 print 函式
    print('這裏是模組 all-verbs')

    控製命令列跳躍至資料夾all-words所在的目錄,然後輸入以下內容,Python 腳本檔案all-verbs.py將作為模組被執行。

    Windows
    python -m all-words.all-verbs
    這裏是模組 all-verbs
    UNIX/Linux/macOS
    python3 -m all-words.all-verbs
    這裏是模組 all-verbs

    通過命令列 -m 參數執行的 Python 模組需要具有對應的 py 腳本檔案或 pyc 位元組碼檔案

    需要指出的是,能夠通過-m參數執行的 Python 模組需要具有對應的py腳本檔案,或者編譯後的pyc位元組碼檔案。因此,執行某些內建 Python 模組將是不可行的,比如常見的sys內建模組。

    Windows
    python -m sys
    : No code object available for sys
    UNIX/Linux/macOS
    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,並為其編寫程式碼。

    all-words/__main__.py
    # 在命令列輸入 python -m 或 python3 -m,並給出 all-words 的“完整名稱”,以執行 print 函式
    print('這裏是 all-words 的 __main__ 模組')

    控製命令列跳躍至資料夾all-words所在的目錄,然後輸入以下內容,__main__模組將被執行。

    Windows
    python -m all-words
    這裏是 all-words 的 __main__ 模組
    UNIX/Linux/macOS
    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

    Windows
    python run.pyc
    我被執行了?\command_line\run.pyc
    UNIX/Linux/macOS
    python3 run.pyc
    我被執行了?/command_line/run.pyc

    Python py 腳本檔案與 pyc 位元組碼檔案的執行優先順序

    如果你所執行的命令沒有明確指出對格式的要求,比如通過-m參數執行,並且在資料夾或zip壓縮檔案中,存在名稱相同的 Pythonpy腳本檔案和pyc位元組碼檔案(不是__pycache__資料夾中的),那麽 Python 將預設優先執行py腳本檔案,編譯的 Pythonpyc位元組碼檔案會被忽略。

    程式碼

    src/zh-hant/command_line·codebeatme/python·GitHub

    講解影片

    如何在命令列或終端機執行 Python 腳本檔案,包含 __main__.py 腳本檔案的資料夾或 zip 壓縮檔案·YouTube