python版本管理(python環境隔離)

renke發表於2021-09-09

這將是一篇比較短的文章。
我發文向來注重文章質量,營養不夠的寧可不發,但是我相信很多人需要這篇文章。
之所以要去搞清楚這個問題,是我在把 vscode 的 inspector 設定為 pipenv 生成的虛擬環境是遇到了問題。2018-2月 vscode 新增了對 pipenv 的支援,檢測到 Pipfile 以後,會將環境自動切換到當前專案的虛擬環境。但是我的咋就不行呢!我就開始折騰。這是一個比較漫長相信你們都不想經歷的過程。希望你們搜到的第一篇文章就是這篇。相關關鍵字如下: vscode 對 pipenv 的支援, vscode 找不到 pipenv 建立的虛擬環境, vscode pipenv, pipenv vscode ...等等
希望能給你帶來更多營養,我多說點
不知不覺,上面的內容可能要佔本文一半以上了。。。
pyenv 和 pipenv 應該是目前主流的 python 版本控制和虛擬環境的工具了,下面內容都基於這兩個。

  1. 從 PATH 開始。當你要執行終端命令的時候,這個命令是從哪來呢,有個環境變數 PATH 企圖hold住這個問題,大部分人列印一下 PATH (echo $PATH) 應該都會發現這樣一部分 /usr/local/bin:/usr/bin:/bin 。執行命令時查詢循序由左到右,/usr/local/bin 裡沒找到去 /usr/bin 裡找,還沒有去 /bin 裡看看。

  2. 基於此 pyenv 做了些什麼呢?他加了個 (pyenv root)/shims 墊片到最左面(具體到 Mac 大多是 /Users/admin/.pyenv/shims 這麼個東西)。這就很巧妙了,加了這個,python 啊 pip 啊這些命令都被這個墊片攔截住了,具體用那個版本那個環境全取決於 shims 裡面 python 的心情,它指哪就打哪。這就說明了一個問題,只要你使用pyenv 執行 which python 的時候永遠都列印 /Users/admin/.pyenv/shims/python 即使它指向的是各種各樣的 python 版本!(which pip 同理)

  3. pyenv 透過環境變數 PYENV_VERSION 控制 python 指向的版本,也就是 pyenv shell 控制的內容,控制順序依次是 pyenv shell, pyenv local, pyenv global。前面的覆蓋後面的。比如 PYENV_VERSION = 2.5 使用的就是這個 python: $(pyenv root)/versions/2.5/bin/python2.5。

  4. 這就是為啥要在 ~/.zshrc (或者 bash 對應的配置檔案)裡面加上 eval "$(pyenv init -),因為要把墊片加到 PATH 的最前面。啟用 pyenv 後再列印 PATH 那一大坨你都不想看。

  5. 說了這麼多還沒扯到問題關鍵呢,怎麼搞。vscode 作者之一在git issues 回答了這個問題,用 pyenv 的時候,是無法自動找到 pipenv 建立的虛擬環境的。這就得繞道了,第一種,可以直接在 vscode 的配置里加上虛擬環境的路徑。類似於 "python.pythonPath": "/Users/admin/.local/share/virtualenvs/......" 這種。該路徑可以透過 pipenv --py 獲取。推薦這種方式,雖然顯得有點麻煩。第二種,遮蔽掉 pyenv 把 ~/.zshrc 裡面的 eval "$(pyenv init -) 去掉,這樣就會用系統的或者 brew 安裝的 python, 在這個裡面安裝 pipenv 之後 vscode 檢測到 Pipfile 就會自動找到虛擬環境並切換了。
    說了這麼多,希望能給你帶來多於答案本身的價值。

原文出處:https://www.cnblogs.com/lihuanqing/p/9999541.html  

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/430/viewspace-2817829/,如需轉載,請註明出處,否則將追究法律責任。

相關文章