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


這將是一篇比較短的文章。
我發文向來注重文章質量,營養不夠的寧可不發,但是我相信很多人需要這篇文章。
之所以要去搞清楚這個問題,是我在把 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 就會自動找到虛擬環境並切換了。
    說了這么多,希望能給你帶來多於答案本身的價值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM