---
# System prepended metadata

title: python -m
tags: [module, '-m', Python]

---

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` 用於將模組當作腳本執行，其功能和行為可能與直接執行腳本不同。
