Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Toward a better Python installation

Toward a better Python installation

Meta

想要的特質

  • 不會太污染 PATH
  • 盡可能避免要求 root/admin 權限
  • 可以同時安裝多個版本(只需要到 minor,不須 patch)
  • 可以輕鬆啟動任意一個版本的 Python,不須多餘設定,版本之間也不會互相衝突

描述架構

重點放在「為什麼」我這樣做,加上一些我嘗試過的其他方法,以及用他們遇到的雷。我覺得最好的方法通常也會有雷,只是在權衡之後我覺得這樣最好。你可以根據我其他的經驗,找到自己覺得最好的選擇,不強迫,反正這些都是建議而已,照做不照做都是後果自負。

Why Not

Anaconda?

因為我不喜歡(完)。

Anaconda 的安裝有點太 magical,對系統的侵入性也太高(自動修改 PATH 之類的),反安裝也比較麻煩。需要改用 conda 安裝東西也是個問題,雖然不是說不能用 pip,但就沒有 only one obvious way to do it,在看網路教學的時候也會比較混淆。

一般推薦 Anaconda 的原因是它裝需要編譯和有系統 dependencies 的套件比較方便,但是以 pip 和 Python 套件生態的整體發展,我覺得現在在整體而言用 Anaconda 常常弊大於利;它可能在一開始會好用(因為用了侵入性方式強行修改你的系統),但是之後如果要做一些它本身管理不了的事情,就會發現你的環境是一團糟,這時候就很難救了。

當然,如果你只做和 Python 有關的事情,且甘願、也已經把一切東西都交給 Anaconda,那它是個很好的 one-stop shop,也沒必要馬上改。但如果不是如此——尤其如果是初學者,還不確定自己未來會做什麼事情,那麼我建議先暫時避開 Anaconda,除非你身邊有人可以幫你處理後續的問題。

安裝 Python

Windows

如果你用非家庭版的 Windows 10 64-bit,也可以考慮下一節的 WSL 安裝法。這會讓你直接用有類 Linux 的執行環境,直接閃掉一堆 Windows 的雷,很方便的。不過 WSL 本身還是很新的技術,所以自己也有一堆雷,我還不確定初學者用這個是不是好主意。

建議使用 https://python.org 的官方安裝程式;盡可能用 64 位元版(除非你的作業系統是 32 位元)。

不要安裝 for all users(選擇 just for me),不要 add python.exe to Path,安裝 py launcher。

Python 3.5 以後的版本才在安裝檔裡自帶 py launcher。如果你想安裝的版本沒有這個選項,就需要同時安裝一個更新版的 Python,才能得到 py launcher。反正你也應該裝個新版啦,別抱怨。如果你真的真的只想裝一個版本,後面會討論怎麼獨立安裝 py launcher。

這會把 Python 安裝到 C:\Users\使用者名稱\AppData\Local\Programs\Python\PythonXY,最後的 PythonXY 代表安裝版本,例如 Python 3.5 就會是 Python35。但是因為 Python 安裝路徑沒有被加入 Path 環境變數,command prompt 現在沒辦法找到它,所以你輸入 python.exe 也沒辦法執行。

舊版的安裝程式(Python 3.4 或更舊)沒辦法自動偵測路徑,即使選擇 just for me 也會嘗試安裝到 C:\PythonXY 然後失敗,需要自行指定上面的安裝路徑。

不加入環境變數的原因很簡單,因為 Windows 這樣做會是個災難。Python 在 Windows 上所有版本都只有一個執行檔,叫 python.exe,而且每個版本各自獨立,不像 Un*x 系統上有統一的 bin directory(而且 Windows 也沒有很好的 symbolic link 支援),所以當你安裝多個版本時,python.exe 就會互相覆蓋,沒辦法很好的共存。

Windows 對多版本的解決方案是使用 Windows registry。當你安裝 Python 時,安裝程式會在 registry 裡註冊該版本的安裝位置。為了方便讀取這些 registry 值,Python 提供了 py launcher。這是一個叫做 py.exe 的執行檔,在安裝時會被放進你的 Path(通常是 C:\Windows)。用法:

指令 行為 大致對等的 Un*x 指令
py 執行預設的 Python(實際版本依系統設定) python
py -2 執行最適合的 Python 2 版本 python2
py -3 執行最適合的 Python 3 版本(通常是最新的) python3
python -3.6 執行 Python 3.6 python3.6

所以如果我想用 Python 3.6 執行 foo.py,就這樣:

py -3.6 foo.py

其他指令也可以給,會直接被 forward 到 Python interpreter,例如

py -3.6 -m venv project_venv

就大致對等在 Un*x 執行

python3.6 -m venv project_venv

也就是用 Python 3.6 的 venv 模組建立一個 venv 放在 project_venv

Why not

Cygwin?

因為 Cygwin 也會引發一群雷。如果你有知識用 Cygwin 大概也不用管這篇,如果沒有的話,要學會怎麼與它共處就是個學問了,和 Anaconda 的問題差不多。

順帶一題,最近發現一個 Cygwin wrapper 叫 Babun 似乎解決了不少 Cygwin 的問題。我自己沒用過(也不打算用),但可以參考一下。

Notes

用官方 Python distribution 在編譯 C-based 套件時可能會用到雷,因為官方版本是用 Visual C++ 編譯,而 VC++ 各版本互不相容,所以你會需要管理很多版本的 Visual C++ 編譯環境。現在大部份這類套件都有 binary 套件了所以還好啦,初學者不用太擔心,等到有需求的時候再學就好或直接換 Linux

我之前有打算做一個類似 pyenv 的工具,可以自動從 python.org 抓特定版本的原碼然後用指定的編譯器 compile,也做了 POC 感覺可行,不過後來發現官方安裝檔 + py launcher 堪用就沒繼續做。誰有興趣的話再來找我吧。

Windows (WSL)

TODO: 討論 WSL 的優劣點,介紹設定方法(設定好 Bash 然後接到 Linux 教學)。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment