# 如何在 Windows 打造一個完全沒問題的 Python 執行環境

不知道大家有沒有這種經驗？就算你裝了 Python 之後還是問題一大堆，沒事的時候就沒事，但只要一出問題就會搞好幾個小時查問題。這篇文章就是要寫給 Python 新手的執行環境安裝手冊。

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/5ae1d836ef1ffb19a15b-383d2c76-13c7-4535-ace4-53b66a4fe2fe.webp)

### 打造 Python 執行環境很簡單

要打造一個沒問題的 Python 執行環境，其實非常簡單，只要搞定以下兩件事：

1.  決定一個 Python 的安裝路徑
    
    例如: `C:\Python312`
    
2.  設定好 `PATH` 環境變數
    
    例如: `C:\Python312;C:\Python312\Scripts`
    

感覺很簡單對不對？事情總是沒有憨人想得這麼簡單，Python 的執行環境真的比想像中複雜許多。

想要解決問題，首先要先理解問題的來源，接下來你才知道怎樣明確的解決問題。

> 其實有很多人不太會修改**環境變數**，所以導致大部分的人都需要依賴所謂的「安裝程式」來安裝 Python 執行環境。當然，安裝程式會幫你自動設定 `PATH` 環境變數，但我們經常需要在不同專案間切換不同的設定值。所以，你只要不會調整環境變數，很多問題都會冒出來。

### 理解問題的來源

你只要上網找 Python 的安裝方法，隨便都可以找出一大堆各種奇形怪狀的文章，但我打算列出幾個重要的問題點，讓你理解潛在的問題在哪裡。

1.  Python 有兩個不太相容的版本：`Python 2` 與 `Python 3`
    
    這算是 Python 的歷史包袱，很無奈，但你就是必須要面對！
    
    如果你想使用的工具與套件只能支援 Python 2 的話，你就必須要安裝 Python 2。
    
    如果你想使用的工具與套件只能支援 Python 3 的話，你就必須要安裝 Python 3。
    
2.  即便是 `Python 3` 版本，還是有小版本之間不相容的情況
    
    我以知名的「[结巴中文分词](https://github.com/fxsjy/jieba/)」為例，這個專案已經 4 年多沒有任何新的進展，你如果要用這個開源的工具，被要求「只能」安裝 `Python 3.7` 以下的版本，只要是 `Python 3.8` 以上就不能用，光是安裝套件就不會成功，而且錯誤訊息非常不清楚。所以，即便連 `Python 3.x` 之間都還有版本問題，並不是只有 `Python 2` 跟 `Python 3` 這麼簡單而已。
    
3.  我們只有一個預設的 `python.exe` 執行檔
    
    就算你設定好了 `PATH` 環境變數，但我們只有一個預設的 `python.exe` 執行檔會被執行，這個執行檔會決定你要執行哪個版本的 Python，你會怎樣選？
    
    你執行看看以下命令：
    
    ```bash
    python -V
    ```
    
    執行結果如下：
    
    ```
    Python 3.12.2
    ```
    
    如果你今天是 Python 的新手，你有很大的概率會直接安裝到 Python 的最新版本，也就是 `3.12.*` 的版本。
    
    如果你 Python 2 與 Python 3 兩個版本都想安裝，那你可能就必須要使用 `python2` 與 `python3` 這兩個執行檔來區分版本。
    
    以下是我電腦的 `python2.exe` 與 `python3.exe` 的所在路徑：
    
    ```
    C:\>where python2
    C:\ProgramData\chocolatey\bin\python2.exe
    
    C:\>where python3
    C:\Users\user\AppData\Local\Microsoft\WindowsApps\python3.exe
    ```
    
    既然有兩個版本，那也意味著會有兩個不同的安裝路徑，也代表會有兩組截然不同的 `PATH` 環境變數值要設定，但是 `python.exe` 只會對第一個出現在 `PATH` 環境變數中的路徑生效。
    
    問題來了，如果有個 Python 專案要求用 `Python 3.7`，另一個專案要用 `Python 3.12`，那你個電腦要怎樣安裝與配置呢？誰幫你決定 `PATH` 環境變數要怎樣設定？何時要切換？手動切換嗎？太麻煩了吧！所以，這是個大問題！
    
4.  市場上 Python 有數十種不同的安裝程式
    
    是的，這萬惡的「安裝程式」有無數版本，除了 [Python 官方](https://www.python.org/downloads/)有出 Windows 安裝程式外，[Chocolatey](https://community.chocolatey.org/packages?q=python) 有出，[Scoop](https://scoop.sh/#/apps?q=python) 有出，[Anaconda](https://www.anaconda.com/download) 有出，連微軟的 [Microsoft Store](https://apps.microsoft.com/search?query=python&hl=zh-tw&gl=TW) 也有一套，每一個安裝程式都會幫你決定「不同」的 Python 的安裝路徑，也會幫你設定不同的 `PATH` 環境變數值，所以當你安裝多種不同的版本後，基本上就有可能會出問題，其實就是路徑的問題而已，但你只要設定錯誤，就會引發一堆奇怪的問題。
    
    我以 Python 官網的安裝檔為例，他預設會安裝到 `C:\Python{ver}` 目錄下。
    
    若以 Chocolatey 為例，他預設會安裝到 `C:\ProgramData\chocolatey\bin` 目錄下。
    
    若以 Anaconda 為例，他預設會安裝到 `%USERPROFILE%\Anaconda3` 目錄下。
    
    若以 Windows 內建的安裝程式為例，你的 Windows 在裝好之後，就有個 `python.exe` 與 `python3.exe` 在系統內 (兩個都是 Python 3 版本)，執行檔路徑位於 `%localappdata%\Microsoft\WindowsApps` 目錄下，也已經設定好 `PATH` 環境變數了，就等著你第一次去執行而已。所以當使用者第一次執行 `python` 命令的時候，系統會自動開啟 Microsoft Store 並自動提示你要安裝 Python 程式，感覺很貼心對不對？錯！等你有需要 Python 多版本管理的時候，就可能會開始踩地雷了！
    
    你知道最邪惡的地方是什麼嗎？就是這些不同的安裝程式，每一個都「有可能」會「貼心」的自動幫你設定或調整 `PATH` 環境變數，所以你要是在不同時期使用了不同的 Python 安裝程式，就「有機會」搞亂你的開發環境。因為，會依賴安裝程式的新手小白，通常是對 `PATH` 環境變數沒有概念的一群人。
    
    我用 [Everything](https://www.voidtools.com/downloads/) 整理了一下在我的電腦中，所有跟 Python 有關的路徑，這些路徑都是之前不知道裝了什麼的情況下建立起來的，真的是亂七八糟：
    
    ```bash
    # Python 官方安裝程式用的 (All Users)
    C:\Python312
    C:\Python312\Scripts
    C:\Python312\Lib
    C:\Python312\Lib\site-packages
    
    # Chocolatey
    %appdata%\Python
    %appdata%\Python\Scripts
    %appdata%\Python\Python37\Scripts
    %appdata%\Python\Python37\site-packages
    
    # Python 官方安裝程式用的 (Just Me)
    %localappdata%\Programs\Python\Python37
    %localappdata%\Programs\Python\Python37\Scripts
    %localappdata%\Programs\Python\Python37\Lib
    %localappdata%\Programs\Python\Python37\Lib\site-packages
    
    # 不知道何時裝的，也不知道何時會用到
    C:\ProgramData\chocolatey\lib\mingw\tools\install\mingw64\opt\lib\python2.7\site-packages
    C:\tools\msys64\usr\lib\python2.7\site-packages
    C:\tools\msys64\usr\lib\python3.4\site-packages
    ```
    
    總結來說，身為一位開發人員，你不可能只面對一個 Python 版本，你有非常高的機率需要在一台電腦中安裝多個不同的 Python 版本，沒遇到這種狀況只能說你還太嫩了！ 😅
    

### 解決問題的方法

基本上，你總是會有機會需要管理多版本的 Python 執行環境，而且我們需要一個可以「自動」切換環境變數的工具，這樣才能夠讓我們專注在開發上，而不是在環境設定上浪費時間。

因此，有個 `Python Virtual Environment` (Python 虛擬環境) 的概念就產生了，這個概念就是讓你可以在同一台電腦中安裝多個不同版本的 Python，並且可以在不同專案中切換不同的 Python 版本，透過虛擬環境幫你自動調整 `PATH` 環境變數，簡化環境管理上的複雜度。

以下我列出幾個比較知名的 Python 虛擬環境管理工具：

1.  [venv](https://docs.python.org/3/library/venv.html)
    
    `venv` 是 `Python 3.3` 版本後內建的虛擬環境工具，使用上非常容易上手，建立虛擬環境只要一個命令，啟用環境也只要一個命令：
    
    ```batch
    REM 建立一個專案目錄
    mkdir pydemo
    REM 進入專案目錄
    cd pydemo
    REM 用 Python 3.7 的 python -m venv 建立一個虛擬環境的資料夾 .venv
    %localappdata%\Programs\Python\Python37\python.exe -m venv .venv
    REM 啟用虛擬環境 (其實就只是幫你設定好 PATH 環境變數而已)
    .venv\Scripts\activate.bat
    ```
    
    使用 `venv` 可以不需要額外安裝其他套件就能建立虛擬環境，比較輕量，但不支援 `Python 2`！
    
    > 詳細使用說明參見 [venv — Creation of virtual environments](https://docs.python.org/3/library/venv.html) 官網文件。
    
2.  [virtualenv](https://virtualenv.pypa.io/en/latest/)
    
    `virtualenv` 也是一套 Python 虛擬環境管理工具，從 `Python 3.3` 開始就有部分功能整併到 Python 官方的 `venv` 模組中。`virtualenv` 擁有比 `venv` 還完整且強大的功能，擴充性也比較強。
    
    > 相關教學可以參閱 [Python 的 Virtualenv 虛擬環境安裝與使用 - AI for K-12 - Medium](https://medium.com/ai-for-k12/python-%E7%9A%84-virtualenv-%E8%99%9B%E6%93%AC%E7%92%B0%E5%A2%83%E5%AE%89%E8%A3%9D%E8%88%87%E4%BD%BF%E7%94%A8-8645f5884aac) 文章。
    
3.  [Poetry](https://python-poetry.org/)
    
    `Poetry` 類似 Python 的 `pip` 套件管理工具，至少需要 `Python 3.8` 以上版本才能用，功能也強大許多，因為它還包含虛擬環境管理功能，而且選項設定可以調整的地方很多，可以說是專業級的工具。當然，相對的上手門檻就會高一些，但也沒想像中這麼難啦，以下這篇文章看完就會用了。
    
    > [Python 套件管理器——Poetry 完全入門指南 - Code and Me](https://blog.kyomind.tw/python-poetry/)
    
4.  [conda](https://conda.io/projects/conda/en/latest/user-guide/getting-started.html)
    
    `conda` 應該也算是老牌的 Python 虛擬環境管理工具了，使用上也算簡便，很好上手。
    
    > 相關教學請見 [用conda建立及管理python虛擬環境](https://medium.com/python4u/%E7%94%A8conda%E5%BB%BA%E7%AB%8B%E5%8F%8A%E7%AE%A1%E7%90%86python%E8%99%9B%E6%93%AC%E7%92%B0%E5%A2%83-b61fd2a76566) 文章。
    
5.  [Anaconda](https://www.anaconda.com/download)
    
    `Anaconda` 內建了「環境管理」功能，算是早期非常好的選擇，不過這套的缺點就是安裝程式有點大，太肥了。
    
    > 相關教學請見 [Python 入門必看！Windows 懶人搭建Anaconda Python 學習環境-入門系列](https://medium.com/%E8%AA%A4%E9%97%96%E6%95%B8%E6%93%9A%E5%8F%A2%E6%9E%97%E7%9A%84%E5%95%86%E7%AE%A1%E4%BA%BAzino/python-%E5%85%A5%E9%96%80%E5%BF%85%E7%9C%8B-windows-%E6%87%B6%E4%BA%BA%E6%90%AD%E5%BB%BAanaconda-python-%E5%AD%B8%E7%BF%92%E7%92%B0%E5%A2%83-%E5%85%A5%E9%96%80%E7%B3%BB%E5%88%97-3fa7ab23b3e9) 文章。
    
6.  [miniconda](https://docs.anaconda.com/free/miniconda/index.html)
    
    `miniconda` 是 `Anaconda` 的輕量版，僅包含了必要的 `conda`、`Python` 與一些常用套件。
    
    > 相關教學請見 [Miniconda 手把手安裝教學 輕量化 Anaconda 客製化自由選擇](https://www.1989wolfe.com/2019/07/miniCONDAwithPython.html) 文章。
    
7.  [pyenv](https://github.com/pyenv/pyenv)
    
    `pyenv` 也是知名的 Python 多版本管理工具，但他並不是建立虛擬環境，而是主要幫助你切換 Python 版本，幫助你調整環境變數而已。
    
    > 相關教學請見 [\[Python 版本控制\] pyenv 基本教學](https://house40105.medium.com/python-%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6-pyenv-%E5%9F%BA%E6%9C%AC%E6%95%99%E5%AD%B8-f1cbf19920be) 文章。
    
    > 若想跟 `Poetry` 搭配使用，可參考 [Poetry + pyenv 教學：常用指令與注意事項](https://blog.kyomind.tw/poetry-pyenv-practical-tips/) 文章。
    
8.  [pipenv](https://pipenv.pypa.io/en/latest/)
    
    `pipenv` 是一個 Python 虛擬環境管理工具，可以協助開發人員達成一致的專案環境。
    
    > 相關教學請見 [Pipenv 更簡單、更快速的 Python 套件管理工具](https://medium.com/@chihsuan/pipenv-%E6%9B%B4%E7%B0%A1%E5%96%AE-%E6%9B%B4%E5%BF%AB%E9%80%9F%E7%9A%84-python-%E5%A5%97%E4%BB%B6%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7-135a47e504f4) 文章。
    

以下算是開發工具與執行環境，有些免安裝就能用：

1.  [WinPython](https://winpython.github.io/)
    
    `WinPython` 是一個免費開源的 Windows 10/11 的可攜式 Python 發行版，免安裝就能用，適用於科學和教育使用。
    
2.  [Thonny](https://github.com/thonny/thonny/)
    
    `Thonny` 是一個輕量級的 Python 開發環境，適合初學者使用，有免安裝版。
    
3.  [PyCharm](https://www.jetbrains.com/pycharm/)
    
    `PyCharm` 是一套商用的 Python 的 IDE 整合開發環境，為了簡化對初學者的複雜度，他預設會替每個專案產生一個虛擬環境，所以可以無腦上手。
    

### 正確的 Python 安裝方法: venv

以下我以 [jieba](https://github.com/fxsjy/jieba) (结巴中文分词) 為例，搭配 Python 內建的 `venv` 模組進行虛擬環境建立，分享我個人的安裝方式，僅供參考。

1.  無論如何，都要先安裝所需的 Python 版本，而且是從 Python 官網下載安裝檔
    
    安裝程式下載: [https://www.python.org/downloads/release/python-379/](https://www.python.org/downloads/release/python-379/)
    
    安裝時有個重點就是，安裝時不要將 Python 加入到 `PATH` 環境變數中！
    
    > 因為我主要想透過 `venv` 來管理虛擬環境，所以我不希望 Python 安裝程式自動幫我設定 `PATH` 環境變數。
    
    安裝時可以選擇安裝到「所有使用者」與「僅自己」兩種，建議是安裝到「僅自己」就好，這部分預設會安裝到 `%localappdata%\Programs\Python` 目錄下。例如 `Python 3.7` 就會自動安裝到 `%localappdata%\Programs\Python\Python37` 目錄。
    
    安裝完成後， 預設的 `python.exe` 會在以下路徑：
    
    ```batch
    %localappdata%\Programs\Python\Python37\python.exe
    ```
    
    若要手動設定 `PATH` 環境變數，可以參考以下這兩個路徑，但其實不用特別手動設定！
    
    ```batch
    %localappdata%\Programs\Python\Python37
    %localappdata%\Programs\Python\Python37\Scripts
    ```
    
2.  初始化 `venv` 環境
    
    建立專案資料夾
    
    ```batch
    cd pydemo && cd pydemo
    ```
    
    用剛剛安裝的 Python 3.7 程式所附的 `python.exe` 來建立虛擬環境：
    
    ```batch
    %localappdata%\Programs\Python\Python37\python.exe -m venv .venv
    ```
    
3.  啟用虛擬環境並開啟 VS Code 編輯器
    
    啟用虛擬環境 (其實就只是幫你設定好 `PATH` 環境變數而已)
    
    ```batch
    .venv\Scripts\activate.bat
    ```
    
    > 注意: 如果你在 VS Code 裡面使用 Microsoft 設計的 [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python) 擴充套件，其實你連 `Scripts\activate.bat` 都不用執行，VS Code 會自動幫你啟用虛擬環境！👍
    
    開啟 VS Code 編輯器 (一定要在啟用環境後再開啟 VS Code 編輯器)
    
    ```batch
    code .
    ```
    
4.  安裝 `jieba` 相關套件
    
    一定要啟用虛擬環境後才能安裝套件！
    
    ```batch
    pip install jieba paddlepaddle-tiny protobuf==3.20.0
    ```
    
5.  撰寫 Python 應用程式
    
    檔名：`main.py`
    
    ```py
    # encoding=utf-8
    import jieba
    
    jieba.enable_paddle()# 启动paddle模式。 0.40版之后开始支持，早期版本不支持
    strs=["我来到北京清华大学","乒乓球拍卖完了","中国科学技术大学"]
    for str in strs:
        seg_list = jieba.cut(str,use_paddle=True) # 使用paddle模式
        print("Paddle Mode: " + '/'.join(list(seg_list)))
    
    seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
    print("Full Mode: " + "/ ".join(seg_list))  # 全模式
    
    seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
    print("Default Mode: " + "/ ".join(seg_list))  # 精确模式
    
    seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
    print(", ".join(seg_list))
    
    seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所，后在日本京都大学深造")  # 搜索引擎模式
    print(", ".join(seg_list))
    ```
    
6.  執行 Python 程式
    
    ```batch
    python main.py
    ```
    

### 正確的 Python 安裝方法: Poetry

以下我以 [jieba](https://github.com/fxsjy/jieba) (结巴中文分词) 為例，搭配 [Poetry](https://python-poetry.org/) 來建立 Python 虛擬環境，分享我個人的安裝方式，僅供參考。

1.  無論如何，都要先安裝所需的 Python 版本，而且是從 Python 官網下載安裝檔
    
    安裝程式下載: [https://www.python.org/downloads/release/python-379/](https://www.python.org/downloads/release/python-379/)
    
    安裝時有個重點就是，安裝時不要將 Python 加入到 `PATH` 環境變數中！
    
    > 因為我主要想透過 `Poetry` 來管理虛擬環境，所以我不希望 Python 安裝程式自動幫我設定 `PATH` 環境變數。
    
    安裝時可以選擇安裝到「所有使用者」與「僅自己」兩種，建議是安裝到「僅自己」就好，這部分預設會安裝到 `%localappdata%\Programs\Python` 目錄下。例如 `Python 3.7` 就會自動安裝到 `%localappdata%\Programs\Python\Python37` 目錄。
    
    安裝完成後， 預設的 `python.exe` 會在以下路徑：
    
    ```batch
    %localappdata%\Programs\Python\Python37\python.exe
    ```
    
2.  初始化 `pyproject.toml` 定義檔
    
    ```bash
    mkdir pydemo
    cd pydemo
    
    poetry init
    ```
    
3.  啟用虛擬環境並開啟 VS Code 編輯器
    
    設定讓虛擬環境直接建立在專案目錄下 (`.venv`) (這個命令一台電腦只需要執行一次)
    
    ```batch
    poetry config virtualenvs.in-project true
    ```
    
    建立虛擬環境 (其實就只是幫你設定好 `PATH` 環境變數而已)
    
    ```batch
    poetry env use "%localappdata%\Programs\Python\Python37\python.exe"
    ```
    
    列出虛擬環境清單
    
    ```batch
    poetry env list
    ```
    
    開啟 VS Code 編輯器
    
    ```batch
    code .
    ```
    
4.  安裝 `jieba` 相關套件
    
    一定要啟用虛擬環境後才能安裝套件！
    
    ```batch
    poetry add jieba paddlepaddle-tiny protobuf==3.20.0
    ```
    
5.  撰寫 Python 應用程式
    
    檔名：`main.py`
    
    ```py
    # encoding=utf-8
    import jieba
    
    jieba.enable_paddle()# 启动paddle模式。 0.40版之后开始支持，早期版本不支持
    strs=["我来到北京清华大学","乒乓球拍卖完了","中国科学技术大学"]
    for str in strs:
        seg_list = jieba.cut(str,use_paddle=True) # 使用paddle模式
        print("Paddle Mode: " + '/'.join(list(seg_list)))
    
    seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
    print("Full Mode: " + "/ ".join(seg_list))  # 全模式
    
    seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
    print("Default Mode: " + "/ ".join(seg_list))  # 精确模式
    
    seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
    print(", ".join(seg_list))
    
    seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所，后在日本京都大学深造")  # 搜索引擎模式
    print(", ".join(seg_list))
    ```
    
6.  執行 Python 程式
    
    ```batch
    python main.py
    ```
    

### 總結

我個人會比較傾向使用 Python 官方的 `venv` 模組來建立虛擬環境，因為他是 Python 內建的模組，不需要額外安裝，而且使用上非常簡單，不需要學習太多的東西，只要會用命令列就可以了。如果用 Visual Studio Code 開發 Python 的話，那更方便，因為 Python 擴充套件會自動幫你啟用 Python 虛擬環境，也非常方便。

我有些專案也會使用 `Poetry` 來管理專案的套件，因為微軟有些專案就是直接用 `Poetry` 來管理 Python 套件的，我覺得很方便，下載套件後直接執行 `poetry install` 就可以把相依套件裝好，無腦使用 Python 開發。感謝 [Python 套件管理器——Poetry 完全入門指南](https://blog.kyomind.tw/python-poetry/) 文章的幫助，讓我更了解 `Poetry` 的使用方式。

### 相關連結

-   [Welcome to Python.org](https://www.python.org/)
-   Visual Studio Code
    -   [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python)
        -   [Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance) - to provide performant Python language support
        -   [Python Debugger](https://marketplace.visualstudio.com/items?itemName=ms-python.debugpy) - to provide a seamless debug experience with debugpy
    -   Python formatters (四選一) ([Formatting Python in VS Code](https://code.visualstudio.com/docs/python/formatting#_choose-a-formatter))
        -   微軟製作的套件
            -   [autopep8](https://marketplace.visualstudio.com/items?itemName=ms-python.autopep8)
            -   [Black formatter](https://marketplace.visualstudio.com/items?itemName=ms-python.black-formatter)
        -   社群發展的套件
            -   [Ruff](https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff)
            -   [yapf](https://marketplace.visualstudio.com/items?itemName=eeyore.yapf)
            -   [isort](https://marketplace.visualstudio.com/items?itemName=ms-python.isort)
    -   Python linters ([Linting Python in Visual Studio Code](https://code.visualstudio.com/docs/python/linting#_choose-a-linter))
        -   微軟製作的套件
            -   [Pylint](https://marketplace.visualstudio.com/items?itemName=ms-python.pylint)
            -   [flake8](https://marketplace.visualstudio.com/items?itemName=ms-python.flake8)
            -   [mypy](https://marketplace.visualstudio.com/items?itemName=ms-python.mypy-type-checker)
        -   社群發展的套件
            -   [Ruff](https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff)
            -   [mypy](https://marketplace.visualstudio.com/items?itemName=matangover.mypy)
