簡體   English   中英

pip 安裝在全局站點包中而不是 virtualenv

[英]pip installing in global site-packages instead of virtualenv

使用pip3在 virtualenv 中安裝virtualenv會導致 package 安裝在全局站點包文件夾中,而不是 virtualenv 文件夾中的那個。 以下是我在 OS X Mavericks (10.9.1) 上設置 Python3 和 virtualenv 的方法:

我使用 Homebrew 安裝了 Python3:

ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
brew install python3 --with-brewed-openssl

更改了.bash_profile中的$PATH變量; 添加了以下行:

export PATH=/usr/local/bin:$PATH

運行which python3返回/usr/local/bin/python3 (在重新啟動 shell 之后)。

注意: which python3仍然返回 / usr/bin/python

使用pip3安裝virtualenv

pip3 install virtualenv

接下來,創建一個新的virtualenv並激活它:

virtualenv testpy3 -p python3
cd testpy3
source bin/activate

注意:如果我不指定 -p python3,則 virtualenv 中的 bin 文件夾中將缺少 pip。

運行which pipwhich pip3都返回 virtualenv 文件夾:

/Users/kristof/VirtualEnvs/testpy3/bin/pip3

現在,當我嘗試在激活的 virtualenv 中使用 pip 安裝例如 Markdown 時,pip 將安裝在全局站點包文件夾中,而不是 virtualenv 的站點包文件夾中。

pip install markdown

運行pip list返回:

Markdown (2.3.1)
pip (1.4.1)
setuptools (2.0.1)
virtualenv (1.11)

/Users/kristof/VirtualEnvs/testpy3/lib/python3.3/site-packages的內容:

__pycache__/
_markerlib/
easy_install.py
pip/
pip-1.5.dist-info/
pkg_resources.py
setuptools/
setuptools-2.0.2.dist-info/

/usr/local/lib/python3.3/site-packages的內容:

Markdown-2.3.1-py3.3.egg-info/
__pycache__/
easy-install.pth
markdown/
pip-1.4.1-py3.3.egg/
setuptools-2.0.1-py3.3.egg
setuptools.pth
virtualenv-1.11-py3.3.egg-info/
virtualenv.py
virtualenv_support/

如您所見,全局站點包文件夾包含 Markdown,而 virtualenv 文件夾沒有。

注意:我之前在不同的 VM 上安裝了 Python2 和 Python3(遵循這些說明)並且 Python3 也有同樣的問題; 不過,在基於 Python2 的 virtualenv 中安裝包可以完美運行。

任何提示、提示……將不勝感激。

有趣的是你提出了這個問題,我剛剛遇到了完全相同的問題。 我最終解決了它,但我仍然不確定是什么原因造成的。

嘗試檢查您的bin/pipbin/activate腳本。 bin/pip ,查看shebang。 正確嗎? 如果不是,請更正。 然后在bin/activate ~ 42行,檢查您的 virtualenv 路徑是否正確。 它看起來像這樣

VIRTUAL_ENV="/Users/me/path/to/virtual/environment"

如果錯了,更正它, deactivate ,然后. bin/activate . bin/activate ,如果我們共同的問題有相同的原因,它應該可以工作。 如果它仍然沒有,無論如何你都在正確的軌道上。 我經歷了同樣的問題去解決日常像你一樣, which pip荷蘭國際集團遍地,以下堆棧跟蹤等。

絕對確保

/Users/kristof/VirtualEnvs/testpy3/bin/pip3

是你想要的,而不是指另一個同名的測試項目(我有這個問題,不知道它是如何開始的。我懷疑是同時運行多個 virtualenvs)。

如果這些都不起作用,那么臨時解決方案可能是,正如喬·霍洛威所說,

只需使用完整路徑運行 virtualenv 的 pip(即不要依賴於搜索可執行路徑),您甚至不需要激活環境。 它會做正確的事情。

也許不理想,但它應該在緊要關頭工作。

鏈接到我的原始問題:

VirtualEnv/Pip 嘗試全局安裝軟件包

對我來說,這不是 pip 或 virtualenv 問題。 這是一個python問題。 在學習了一些在線教程后,我在 ~/.bash_profile(或 ~/.bashrc)中手動設置了我的 $PYTHONPATH。 這個手動設置的 $PYTHONPATH 在 vi​​rtualenv 中可用,因為它可能應該被允許。

此外,出於某種原因, add2virtualenv沒有將我的項目路徑添加到我的 $PYTHONPATH 中。

對於那些可能仍然被卡住的人來說,只是一些分叉路徑! 干杯!

我遇到了同樣的問題,我通過刪除 venv 目錄並重新創建它來解決它!

deactivate (if venv is activated first deactivate it)
rm -rf venv
virtualenv -p python3 venv
. ENV/bin/activate
pip3 install -r requirements.txt

現在一切都像一個魅力。

我在安裝了 python 2 和 3 的 macos 上遇到了同樣的問題。

另外,我有別名指向.bash_profile python3 和 pip3 。

alias python=/usr/local/bin/python3
alias pip=/usr/local/bin/pip3

使用python3 -m venv venv刪除別名並重新創建虛擬python3 -m venv venv解決了該問題。

首先要檢查的是 pip 解析到的位置:

which pip

如果你在一個 virtualenv 中,你會期望這會給你類似的東西:

/path/to/virtualenv/.name_of_virtualenv/bin/pip

但是,由於某種原因,它可能會解析到您的系統 pip。 例如,您可能會在您的 virtualenv 中看到這一點(這很糟糕):

/usr/local/bin/pip (或任何不在您的 virtualenv 路徑中的東西)。

要解決此問題,請檢查您的 pipconfig:

~/.pipconf
~/.conf/pip
/etc/pip.conf

並確保沒有任何東西強制您的 Python 路徑或 pip 路徑(這為我修復了它)。

然后嘗試啟動一個新終端並重建您的 virtualenv(刪除然后再次創建它)

我也有這個問題。 從我的 Mavericks Mac 上的 Python 3.3 虛擬環境中的/bin目錄調用pip install <package_name>導致 Python 包安裝在 Python 2.7 全局站點包目錄中。 盡管事實上我的 $PATH 以包含pip的目錄開頭。 奇怪。 這不會發生在 CentOS 上。 對我來說,解決方案是調用pip3而不是pip 當我通過ez_setup在虛擬環境中安裝pip 時,三個“pip”可執行文件已經安裝在/bin目錄中 - pippip3pip3.3 奇怪的是,這三個文件完全一樣。 調用pip3 install <package_name>導致 Python 包被正確安裝到本地 site-packages 目錄中。 使用完整路徑名調用pip進入虛擬環境也可以正常工作。 我很想知道為什么我的 Mac 沒有像我期望的那樣使用 $PATH 。

我在從 virtualenv 中安裝 python 包時遇到了同樣的問題。 在我的案例中,根本原因是不同的。 在 virtualenv 中,我(出於對 Ubuntu 的習慣)執行以下操作:

sudo easy_install -Z <package>

這導致 bin/pip shebang 被忽略,並使用 root 的非 virtualenv python 將其安裝在全局站點包中。 由於我們有一個虛擬環境,我們應該安裝沒有“sudo”的包

轉到虛擬環境中的 bin 目錄並像這樣編寫:

./pip3 install <package-name>

我在運行 Manjaro 時偶然發現了同樣的問題。 我使用python3 -m ven venv創建了虛擬環境,然后使用source venv/bin/actiave which pythonwhich pip都指向 virtualenv 中正確的二進制文件,但是我無法安裝到 virtualenv,即使使用二進制文件的完整路徑。 原來,當我用sudo pacman -R python-pip python-reportlab (必須包含 reportlab 以滿足依賴項)卸載 python-pip 包時,一切都開始按預期工作。 不知道為什么,但這可能是由於系統包優先的雙重安裝。

更新到pip==8.0.0后我遇到了類似的問題。 不得不求助於調試 pip 來找出錯誤的路徑。

事實證明,我的配置文件目錄有一個帶有一些空路徑值的 distutils 配置文件。 這導致所有包都安裝到同一個根目錄而不是適當的虛擬環境(在我的例子中是/lib/site-packages )。

我不確定配置文件是如何到達那里的,或者它是如何有空值的,但它是在更新 pip 后啟動的。

如果其他人遇到同樣的問題,只需刪除文件~/.pydistutils.cfg (或刪除空配置路徑)即可解決我環境中的問題,因為 pip 返回到默認的分布式配置。

今天遇到了同樣的問題。 我只是使用sudo easy_install pip (OSX/Max) 重新安裝了全局sudo easy_install pip ,然后使用sudo virtualenv nameOfVEnv再次創建了我的 virtualenv。 然后在激活新的 virtualenv 后, pip命令按預期工作。

我不認為我在第一次創建 virtualenv 時使用了sudo ,這可能是無法從 virtualenv 中訪問pip的原因,我能夠在此修復之前訪問pip2 ,盡管這很奇怪。

以下是一些可以在使用虛擬環境時避免頭痛的做法

  • 為您的項目創建一個文件夾。
  • 在此文件夾中創建您的Virtualenv項目。
  • 激活項目環境后,切勿使用“ sudo pip install package ”。
  • 完成工作后,始終“停用”您的環境。
  • 避免重命名您的項目文件夾。


為了更好地表示這種做法,這里是一個模擬:


為您的項目/環境創建一個文件夾

$ mkdir venv

創造環境

$ cd venv/ 

$ virtualenv google_drive
New python executable in google_drive/bin/python
Installing setuptools, pip...done.

活化環境

$ source google_drive/bin/activate

安裝包

(google_drive) $ pip install PyDrive
Downloading/unpacking PyDrive
Downloading PyDrive-1.3.1-py2-none-any.whl
...
...
...    
Successfully installed PyDrive PyYAML google-api-python-client oauth2client six uritemplate httplib2 pyasn1 rsa pyasn1-modules
Cleaning up...

環境中可用的包

(google_drive) $ python
Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import pydrive.auth
>>>  
>>> gdrive = pydrive.auth.GoogleAuth()
>>>

停用環境

(google_drive) $ deactivate 

$ 

包在環境之外不可用

(google_drive) $ python
Python 2.7.6 (default, Oct 26 2016, 20:32:10) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import pydrive.auth
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named pydrive.auth
>>> 

注意事項:

為什么不是sudo?

Virtualenv 為您創建了一個全新的環境,定義了 $PATH 和一些其他變量和設置。 當您使用sudo pip install package 時,您以root身份運行 Virtualenv,轉義創建的整個環境,然后在全局站點包上安裝包,而不是在您擁有虛擬環境的項目文件夾中,盡管您已經激活了環境。

如果您重命名項目的文件夾(如已接受的答案中所述)...

...您必須從項目的bin目錄中的某些文件中調整一些變量。

例如:

bin/pip, line 1 (She Bang)

bin/activate,第 42 行(VIRTUAL_ENV)

我有這個問題。 事實證明,我的一個文件夾名稱中有一個空格導致了問題。 我刪除了空間,使用 venv 刪除並重新實例化,一切都很好。

創建 virtualenv 實例然后更改父文件夾名稱時會出現此問題。

以上解決方案都不適合我。

我的 venv 很活躍。 pip -Vwhich pip給了我正確的 virtualenv 路徑,但是當我使用激活的 venv pip install -ed 包時,我的pip freeze保持為空。

所有的環境變量也是正確的。

最后,我只是更改了 pip 並刪除了 virtualenv:

easy_install pip==7.0.2

pip install pip==10

sudo pip uninstall virtualenv

重新安裝 venv:

sudo pip install virtualenv

創建 venv:

python -m virtualenv venv_name_here

並且所有軟件包再次正確安裝到我的 venv 中。

創建虛擬環境后,嘗試使用位於yourVirtualEnvName\\Scripts 中的pip

它應該在您的虛擬環境中的Lib\\site-packages中安裝一個包

我在 Windows 上遇到了類似的問題。 這是由於在 virtualenv 文件夾名稱內重命名我的項目中的文件夾結構引起的。 文件中的路徑沒有改變,但在創建虛擬環境時保持原樣。 正如 Chase Ries 提到的,我已經將文件中的路徑更改為 VIRTUAL_ENV 和 python.exe

  1. ./venv/Scripts/activate.bat ,在文件中set "VIRTUAL_ENV=path_to_venv\\venv" 11 行
  2. ./venv/Scripts/Activate.ps1 , $env:VIRTUAL_ENV="path_to_venv\\venv"文件中的 30 行
  3. ./venv/Scripts/pip.exe , #!d:\\path_to_env\\venv\\scripts\\python.exe這行在文件的末尾,在我的例子中移動到 667 行的右側,我正在處理光盤d 所以在路徑的開頭是它的字母
  4. ./venv/Scripts/pip3.7.exe , #!d:\\path_to_env\\venv\\scripts\\python.exe這行在文件的末尾,在我的例子中移到了右邊的 667 行
  5. ./venv/Scripts/pip3.exe , #!d:\\path_to_env\\venv\\scripts\\python.exe這行在文件的末尾,在我的例子中移到了右邊的 667 行

我也有這個問題。 調用sudo pip install導致 Python 包安裝在全局站點包目錄中,調用pip install工作正常。 所以不要在 virtualenv 中使用sudo

同樣的問題。 從 Linux rpm安裝的 Python3.5 和 pip 8.0.2。

我沒有找到主要原因,無法給出正確答案。 看起來有多種可能的原因。

但是,我希望我可以幫助分享我的觀察和解決方法。

  1. pyvenv--system-site-packages

    • ./bin不包含pippip可從系統站點包中獲得
    • 軟件包是全局安裝的( BUG?
  2. pyvenv沒有--system-site-packages

    • pip被安裝到./bin ,但它是一個不同的版本(來自ensurepip
    • 軟件包安裝在虛擬環境中( OK

pyvenv明顯解決方法--system-site-packages

  • 在沒有--system-site-packages選項的情況下創建它
  • pyvenv.cfg文件中的include-system-site-packages = false更改為true

還值得檢查您是否沒有以某種方式修改 virtualenv 的路徑。

在這種情況下, bin/pip的第一行(以及其余的可執行文件)將具有不正確的路徑。

您可以編輯這些文件並修復路徑,也可以刪除並重新安裝 virtualenv。

對於 Python 3ers

嘗試更新。 我遇到了完全相同的問題並嘗試了 Chases 的回答,但沒有成功。 重構它的最快方法是盡可能更新您的 Python Minor / Patch 版本。 我注意到我正在運行 3.5.1 並更新到 3.5.2。 Pyvenv 再次起作用。

當我在錯誤的位置創建 virtualenv 時,這發生在我身上。 然后我想我可以將目錄移動到另一個位置而不重要。 這很重要。

mkdir ~/projects
virtualenv myenv
cd myenv
git clone [my repository]

哦,廢話,在創建 virtualenv 和克隆代表之前,我忘了 cd 進入projects 哦,好吧,我懶得破壞和重建。 我會毫無問題地移動目錄。

cd ~
mv myenv projects
cd projects/myenv/myrepo
pip install -r requirements

不,想要更多權限,什么? 我覺得這很奇怪,但 SUDO AWAY! 然后將軟件包安裝到全局位置。

我學到的教訓是,只需刪除 virtualenv 目錄。 不要動它。

安裝 Divio 后出現此問題:它在啟動終端時以某種方式更改了我的 PATH 或環境。

在這種情況下,解決方案只是執行source ~/.bash_profile ,它應該已經設置好讓你回到原來的 pyenv/pyenv-virtualenv 狀態。

不知何故,項目文件夾中帶有前綴 =“”的 setup.cfg 文件

在項目文件夾外的 virtualenv 上運行 pip install 工作,因此從內部告訴 pip 使用默認為“/”的空前綴

刪除文件修復它

當我使用--python=python3.6標志安裝virtualenv時,這發生在我身上,但后來嘗試使用pip2 install
使用將要使用的版本標記創建virtualenv可以解決權限問題。 要檢查,請嘗試使用which pipwhich pip2which pip3 (取決於您的選擇)。 如果有任何pip您使用顯示的路徑不venv這里是你的問題。

我遇到了這個問題,在嘗試了上述所有解決方案后,我只是刪除了所有內容並重新開始。

在我自己的情況下,我使用sudo創建虛擬環境存在的文件夾之一,並且 sudo 將特權授予 root

我非常生氣! 但它奏效了!

出於某種原因,我必須使用“sudo”在我的 ubuntu 系統上通過 pip 安裝軟件包。 這導致軟件包安裝在全局站點軟件包中。 將此放在此處,供將來可能會遇到此問題的任何人使用。

我正是標題中的問題,我解決了它。 在我清理完 PATH 后,Pip 開始安裝在 venv 站點包中:它一開始就有一個到我本地 ~/bin 目錄的路徑。

所以,我的建議是:徹底檢查你的環境變量是否有“垃圾”或任何非標准的東西。 不幸的是,virtualenv 可能對這些很敏感。

祝你好運!

上面有很多很好的討論,但使用了 virtualenv 示例。 由於'conda'現在是管理virtualenv的推薦工具,我總結了在conda env中運行pip的步驟如下。

我將使用 py36r 作為 env 的名稱,/opt/conda/envs 是 envs 的前綴):

$ source /opt/conda/etc/profile.d/conda.sh # skip if already done 
$ conda activate py36r
$ pip  install pkg_xyz
$ pip  list | grep pkg_xyz

請注意,執行的 pip 應該在/opt/conda/envs/py36r/bin/pip (不是/opt/conda/bin/pip )中。

或者,您可以簡單地運行以下命令而無需 conda activate

$ /opt/conda/envs/py36r/bin/pip

此外,如果您使用 conda 安裝,則無需激活即可安裝:

$ conda install -n py36r pkg_abc ...

簡短的回答是使用參數“—no-site-packages”運行命令 virtualenv。

帶解釋的長答案:-

所以在這里和那里跑來跑去,經歷了很多線程之后,我發現我自己是問題所在。 以上答案已經給出了想法,但我想再次討論所有內容。

  • 問題是即使您正在激活環境,它也指的是系統環境,因為我們創建 virtualenv 的方式。

  • 當我們運行命令virtualenv env -p python3 時,它會安裝 virtualenv,但不會創建 no-global—site-packages.txt。

  • 因此,當您通過 source activate 命令激活環境時,該文件名為 site.py(名稱可能不同,我只是忘記了),它會運行並檢查此文件是否不存在,它不會將您的 env 路徑添加到 sys.path並使用系統python。

  • 要解決此問題,只需運行帶有額外參數的 virtualenv —no-site-packages 它將創建該文件,當您激活環境時,它將在您的 PATH 變量中添加您的自定義環境路徑,使其可訪問。

視窗

對我來說,解決方案不是使用mkvirtualenv ,而是:

python -m venv path/to/your/virtualenv

workon 工作正常。

在 virtualenv 中: pip -V顯示 virtualenv 的 pip 路徑

我也遇到了這個問題,困擾了我很久,后來按照@Chase Ries的方法解決了。

解決問題的關鍵是:

嘗試檢查您的bin/pipbin/activate腳本。 bin/pip中,查看 shebang。 這是正確的嗎? 如果不是,請更正。 然后在你的bin/activate中的 ~ 42行,檢查你的 virtualenv 路徑是否正確。 它看起來像這樣

VIRTUAL_ENV="/Users/me/path/to/virtual/environment"

如果錯了,更正它, deactivate ,然后. bin/activate . bin/activate ,如果我們的共同問題有相同的原因,它應該有效。

下面,我將在Ubuntu環境下詳細說明這個過程, WindowsMacOS也是如此。

這句話的意思是我們要檢查虛擬環境下bin/pip文件的第一行#!/path/python是否正確。

正如我的文件中最初顯示的那樣:

#./home/banni/dai/.venv/bin/python3

在終端運行pip絕對路徑):

/home/banni/dai/.venv/bin/pip

會發現錯誤:

bash: ./pip: /home/banni/dai/.venv/bin/python3: bad interpreter: No such file or directory

現在我很困惑為什么我找不到這個python3 ,因為python3存在於虛擬環境所在的文件夾.venv/bin中。

我檢查了文件夾.venv/bin的絕對路徑。 執行pwd命令后,顯示:

/home/banni/Research/dai/.venv/bin

仔細觀察.venv文件夾的路徑發生了變化。 /bin/pip文件的第一行更改為

#./home/banni/Research/dai/.venv/bin/python3

同理檢查並修改bin/activate文件。

我將VIRTUAL_ENV="/home/banni/dai/.venv"更改為VIRTUAL_ENV="/home/banni/Research/dai/.venv"

此時,激活虛擬環境后,可以正常執行pip命令。

所以,對我來說,這個問題的原因是虛擬環境所在文件夾的路徑發生了變化(之前整理文件夾時留下的秘密問題)。

但是由於虛擬環境所在的文件夾位置發生了變化,可能會出現很多路徑錯誤,所以最簡單的方法就是將虛擬環境所在的文件夾恢復到原來的位置。

  1. 激活虛擬環境
  2. 使用where pip找出 pip 位置,如果在基礎環境中,可能沒有安裝 'pip'
  3. 類型

康達安裝 pip

享受!

我檢查了這里的所有答案,但沒有一個對我有用。 特別檢查了 Chase Ries 的答案,目錄在 pip.exe 和 activate.bat(對於 Windows)中是正確的

我通過將位於 C:\Users\oguno\AppData\Roaming\pip 的 pip.ini(對於 Windows,我認為它是其他操作系統的其他東西)復制到 C:\Users\oguno\Desktop\iec61850 解決了這個問題\myenv3 我的 venv 所在的位置並將目標更改為 C:\Users\oguno\Desktop\iec61850\myenv3\Lib\site-packages 這顯示了我的虛擬環境中的站點包。

對於那些檢查了 python 和 pip 有正確的 virtualenv 路徑的人,另一個可能的問題在於 pip 配置

就我而言,我在配置文件中添加了 --prefix 以在不同路徑中安裝包。 這被 virtualenv 881334444827288 拾取,導致安裝在與全局 pip 相同的位置。

我遇到了這個問題,並通過刪除目錄中導致 venv 路徑的空格來修復它。

我有同樣的問題。 Pip 僅全局安裝。 這意味着pip的配置有問題。

首先,找到 pip 配置文件:

python -m pip config debug

它將列出所有 pip 配置文件。 如果有“假”(沒有文件),創建它(或添加行尊重 - virtualenv = true):

   [global]
   default-timeout = 60
   respect-virtualenv = true
   download-cache = /tmp
   log-file = /tmp/pip-log.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM