virtualenv機制簡述及強制改名產生的後遺症解決

問題的起源在於,我在用virtualenvwrapper創建虛擬環境的時候,不小心起錯了名字,把“virtual”打成了“virtal”;於是每次workon的時候出來的都是virtalenv-py3,很難受。
後來我在Home文件夾中發現了隱藏的.virtualenv文件夾,打開就看到了virtalenv-py3文件夾,即你創建的虛擬環境以一個文件夾的形式保存在了.virtualenv裏。
然後我直接改了虛擬環境文件夾的名字,把virtalenv-py3改成了virtualenv-py3,這時workon就變成了virtualenv-py3,修改成功。

然而後來問題出現了,我想使用tensorboard的時候,發現找不到這個命令;然後在虛擬環境裏用pip list查看安裝的package,發現和外圍真實環境是一樣的;也就是說,此時的pip等命令並不在虛擬環境裏,而是真正的、virtualenv之外的環境。

這裏簡介一下.virtualenv/virtualenv-py3的幾個目錄結構:
bin是二進制文件,也就是,在虛擬環境中,通過命令行輸入命令的時候,是在這個文件夾查找對應命令的。
.virtualenvs/virtualenv-py3/lib/python3.5/site-packages:這裏就是安裝的所有第三方包,和pip list是對應的。

查閱資料( 廖雪峯的官方網站)後發現virtualenv是如何創建“獨立”的Python運行環境的呢?原理很簡單,就是把系統Python複製一份到virtualenv的環境,用命令source virtualenv-py3/bin/activate進入一個virtualenv環境時,virtualenv會修改相關環境變量,讓命令python和pip均指向當前的virtualenv環境。

於是我打開了.virtualenv/virtualenv-py3/bin/activate文件,在43行看到:

VIRTUAL_ENV="/home/elijha/.virtualenvs/virtalenv-py3"

然後我把virtalenv改成了virtualenv。再從命令好輸入命令,用tab補全,發現成功了,即此時環境變量已經指向了.virtualenv/virtualenv-py3/bin/而不再是真實的環境。

同時我發現還有一個activate.fish文件,裏面39行同樣有一個”/home/elijha/.virtualenvs/virtalenv-py3”,我也改成了正確的。

然後我又運行pip list,發現又報錯:

bash: /home/elijha/.virtualenvs/virtualenv-py3/bin/pip: /home/elijha/.virtualenvs/virtalenv-py3/bin/python3: bad interpreter: Not a directory

我猜是pip腳本除了問題。又打開.virtualenv/virtualenv-py3/bin/pip文件,發現第一行爲:
#!/home/elijha/.virtualenvs/virtalenv-py3/bin/python3

“#!”的意思是,讓當前腳本被/home/elijha/.virtualenvs/virtalenv-py3/bin/python3解釋器運行。我看了目錄,的確有個python3程序。所以問題就明白了,pip沒有找到對應位置的python3解釋器;這是顯然的,因爲我改了目錄。所以我把這一行的python3的路徑改成了“virtualenv-py3”,隨即成功。

但是我發現,這個bin文件夾裏的所有py腳本的第一行都是:
#!/home/elijha/.virtualenvs/virtalenv-py3/bin/python3
這就意味着,我要把每個文件的這一句都改過來……(完)

發佈了28 篇原創文章 · 獲贊 13 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章