python -m === ###### tags: `Python` ###### tags: `Python`, `-m`, `module` <br> [TOC] <br> ## 討論 ### `python -m xxx` 和 `python xxx.py` 是相同效果嗎?還是 -m 有其他用法? - ### o1-preview `python -m xxx` 與 `python xxx.py` 並不完全相同,兩者之間存在一些重要的差異。 **`python -m xxx` 的作用:** - **執行模組**:`-m` 選項告訴 Python 解譯器將指定的模組 `xxx` 當作腳本來執行。這表示 Python 會在模組搜尋路徑(`sys.path`)中尋找名為 `xxx` 的模組或套件,然後執行其 `__main__.py` 文件中的程式碼。 - **適用於套件和模組**:可以執行包含 `__main__.py` 的套件,或單一模組。 - **支援相對導入**:由於模組是在其套件的上下文中執行,使用相對導入不會有問題。 **`python xxx.py` 的作用:** - **執行腳本檔案**:直接執行當前目錄下名為 `xxx.py` 的腳本檔案。 - **`__name__` 的值**:在該腳本中,`__name__` 的值為 `"__main__"`。 - **模組搜尋路徑不同**:腳本所在的目錄會被加入到 `sys.path` 的開頭,這可能會影響模組的導入。 **主要差異:** 1. **搜尋路徑**:`python -m xxx` 使用模組搜尋路徑,而 `python xxx.py` 直接在指定的檔案路徑下執行腳本。 2. **相對導入**:使用 `-m` 選項可以正確處理相對導入,而直接執行腳本可能會導致相對導入失敗。 3. **可執行套件**:`-m` 允許執行套件,這在直接執行腳本時是不可能的。 **範例:** - 執行 HTTP 伺服器: ``` python -m http.server ``` - 直接執行腳本: ``` python script.py ``` **結論:** `-m` 選項有其特定的用途,主要用於以模組或套件的方式執行程式碼,這在某些情況下會有不同的行為。因此,`python -m xxx` 與 `python xxx.py` 並不總是產生相同的效果。 總而言之,兩者不完全相同;`-m` 用於將模組當作腳本執行,其功能和行為可能與直接執行腳本不同。