這將是一篇比較短的文章。
我發文向來注重文章質量,養分不夠的寧肯不發,可是我相信不少人須要這篇文章。
之因此要去搞清楚這個問題,是我在把 vscode 的 inspector 設置爲 pipenv 生成的虛擬環境是遇到了問題。2018-2月 vscode 添加了對 pipenv 的支持,檢測到 Pipfile 之後,會將環境自動切換到當前項目的虛擬環境。可是個人咋就不行呢!我就開始折騰。這是一個比較漫長相信大家都不想經歷的過程。但願大家搜到的第一篇文章就是這篇。相關關鍵字以下: vscode 對 pipenv 的支持, vscode 找不到 pipenv 建立的虛擬環境, vscode pipenv, pipenv vscode ...等等
但願能給你帶來更多養分,我多說點
不知不覺,上面的內容可能要佔本文一半以上了。。。
pyenv 和 pipenv 應該是目前主流的 python 版本控制和虛擬環境的工具了,下面內容都基於這兩個。python
- 從 PATH 開始。當你要執行終端命令的時候,這個命令是從哪來呢,有個環境變量 PATH 企圖hold住這個問題,大部分人打印一下 PATH (echo $PATH) 應該都會發現這樣一部分 /usr/local/bin:/usr/bin:/bin 。執行命令時查找循序由左到右,/usr/local/bin 裏沒找到去 /usr/bin 裏找,尚未去 /bin 裏看看。
- 基於此 pyenv 作了些什麼呢?他加了個 (pyenv root)/shims 墊片到最左面(具體到 Mac 大可能是 /Users/admin/.pyenv/shims 這麼個東西)。這就很巧妙了,加了這個,python 啊 pip 啊這些命令都被這個墊片攔截住了,具體用那個版本那個環境全取決於 shims 裏面 python 的心情,它指哪就打哪。這就說明了一個問題,只要你使用pyenv 運行 which python 的時候永遠都打印 /Users/admin/.pyenv/shims/python 即便它指向的是各類各樣的 python 版本!(which pip 同理)
- 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。
- 這就是爲啥要在 ~/.zshrc (或者 bash 對應的配置文件)裏面加上 eval "$(pyenv init -),由於要把墊片加到 PATH 的最前面。啓用 pyenv 後再打印 PATH 那一大坨你都不想看。
- 說了這麼多還沒扯到問題關鍵呢,怎麼搞。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 就會自動找到虛擬環境並切換了。 說了這麼多,但願能給你帶來多於答案自己的價值。