繁体   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