![](/img/trans.png)
[英]Why pip uses global packages when created a clean virtualenv using python2.7?
[英]Why is my virtualenv's pip listing packages in my lib/python2.7 directory?
在我的家中,我有一個名為lib/python2.7
的目錄(對於不同的python版本,實際上有五個目錄)。 由於這是一個共享托管( Webfaction ),因此該目錄對我而言至關重要。 在那里,我安裝了諸如virtualenv
和virtualenvwrapper
類的東西,因為作為共享主機的客戶,我無權訪問sudo
和安裝全局軟件包。
但是,當我創建一個virtualenv時:
$ mkvirtualenv myenvironment
$ workon myenvironment
$ which pip
# outputs the myenvironment's path to pip
$ pip freeze
該命令在我的lib/python2.7
下顯示了整個軟件包列表(這包括相同的virtualenv軟件包,以及由於……傳統……原因而導致的沖突軟件包)。 如果我要安裝一個軟件包(它是lib/python2.7
中的軟件包的名稱),這也讓我lib/python2.7
因為它不允許我對其進行更新。
在workon
環境中,我嘗試檢查PYTHONPATH是否具有奇怪的內容,但是它是空的:
$ echo $PYTHONPATH
# shows a blank line
如果我在任何虛擬環境中嘗試執行該命令,則它也是空的。
似乎--no-site-packages
是默認的,但只能解決部分問題。 這意味着: pip freeze | wc -l
在任何環境中, pip freeze | wc -l
在環境中顯示的值要小於全局執行時的值,這告訴我,某些已提供的軟件包已被排除在主機之外(而我卻未安裝,因為,再次,托管是共享的 ,我無法訪問全局空間)。
我的問題是:我該如何解決? 我希望我的virtualenv不在$HOME/lib/python2.7
列出軟件包
請避免對此問題進行重復鏈接,那里沒有任何用處,但仍然沒有可接受的答案。 在閱讀並嘗試了該問題的每個解決方案后,我寫了這個問題
我認為您需要指定python版本。 您可以使用以下命令指定要用於創建虛擬環境的python版本
virtualenv -p /usr/bin/python3.4 virt/virtname --no-site-packages
因為當您不指定python版本時,virtualenv會使用pythonv2.7創建一個環境,因此所有軟件包最終都位於您提到的文件夾中。
經過深入挖掘,找到了解決方案。 這是一個Webfaction定制,但是如果出現問題,則可以將其應用於任何此類安裝。
問題的核心是Webfaction為我們配置了一個sitecustomize.py文件 。 該文件位於/usr/local/lib/pythonX.Y/sitecustomize.py
並自行添加~/lib/pythonX.Y
的內容(如果有工作,則有條件地添加~/webapps
下任何python應用程序的內容在其目錄下運行python腳本)。
即使virtualenv的python可執行文件是一個不同的文件,它也會每次像基本python可執行文件一樣運行時加載所述sitecustomize.py
文件。
解決方法在這里? 在virtualenv中創建一個空的sitecustomize.py以覆蓋另一個:
touch ~/.virtualenvs/yourvenv/lib/pythonX.Y/sitecustomize.py
它將起作用。 如果您像我一樣被困在這里,可以以此為參考
注意 :將每種情況下的XY替換為您正在使用的相應版本。 另外請記住: 在這種情況下,您不能刪除或編輯基本sitecustomize.py,因為您位於共享主機中。 但是,只要您對所需的每個virtualenv都執行覆蓋,則覆蓋將適用於每種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.