在全局站点软件包而不是virtualenv中进行pip安装


98

使用pip3在a中安装软件包将virtualenv导致该软件包安装在global site-packages文件夹中,而不是安装在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

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

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

运行which python3返回/usr/local/bin/python3(重新启动外壳程序之后)。

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

virtualenv使用安装pip3

pip3 install virtualenv

接下来,创建一个新的virtualenv并激活它:

virtualenv testpy3 -p python3
cd testpy3
source bin/activate

注意:如果我不指定-p python3,则virtualenv中bin文件夹中将缺少pip。

正在运行,which pip并且which pip3都返回virtualenv文件夹:

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

现在,当我尝试使用pip在已激活的virtualenv中安装Markdown时,pip将安装在全局site-packages文件夹中,而不是virtualenv的site-packages文件夹中。

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/

如您所见,全局 site-packages文件夹包含Markdown,virtualenv文件夹没有。

注意:之前我在不同的VM上安装了Python2和Python3(遵循这些说明),并且Python3遇到了相同的问题。不过,在基于Python2的virtualenv中安装软件包的工作非常正常。

任何提示,暗示……将不胜感激。


如果已有pip,则不会安装软件包。您应该在其输出中看到“已满足需求”。尝试安装尚未安装的软件包。顺便说一句,pip3可能会使用非棕色python3(如何安装pip3?)。它本身可能还不错,但您应该知道是否存在。
jfs 2014年

1
我之前没有安装Markdown。全局软件包列表为空。我尝试使用哪种包都没有关系,我每次都能重现此行为。
ƘɌỈSƬƠƑ

关于pip3:这是由homebrew与Python3一起安装的。
ƘɌỈSƬƠƑ

对我来说,这也帮助了:stackoverflow.com/questions/14695278/...只是为了仅供参考他人
Nagaraj Tantri

Answers:


90

有趣的是您提出了这个问题,我只是遇到了完全相同的问题。我最终解决了它,但是我仍然不确定是什么原因造成的。

尝试检查您的bin/pipbin/activate脚本。在中bin/pip,查看shebang。这是正确的吗?如果不是,请更正它。然后在〜42中的〜行中bin/activate,检查您的virtualenv路径是否正确。它看起来像这样

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

如果是错误的,请更正deactivate,然后进行纠正,. bin/activate如果我们的共同问题有相同的原因,也应该可以解决。如果仍然没有,无论如何,您都处在正确的轨道上。我经历了与您相同的问题解决例程,which pip一遍又一遍,遵循堆栈跟踪等。

绝对要确保

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

是您想要的,而不是引用另一个类似名称的测试项目(我有这个问题,不知道它是如何开始的。我怀疑是同时运行多个virtualenvs)。

如果这些都不起作用,那么可能会采取临时解决方案,如乔·霍洛威(Joe Holloway)所说,

只需使用其完整路径运行virtualenv的pip(即,不依赖于搜索可执行路径),甚至不需要激活环境。它将做正确的事。

也许不是理想的,但它应该在紧要关头工作。

链接到我的原始问题:

VirtualEnv / Pip尝试在全局安装软件包


1
谢谢蔡斯。在发布我的消息之前,我是根据您的问题提出的,但似乎我跳过了提到shebang的最后一行。实际上,它被设置为#!/usr/local/bin/python3.3而不是#!/Users/kristof/VirtualEnvs/testpy3/bin/python3.3。我进行了更改,激活了virtualenv并安装了Markdown软件包。现在,Pip安装在virtualenv site-packages文件夹中,而不是全局文件夹中。
ƘɌỈSƬƠƑ

我也遇到了这个问题,非常感谢您的回答。我注意到了shebang,然后立刻发现了这个问题,证实了我的怀疑。有谁知道为什么shebang错了?最好找到一个永久性修复程序,这样我们就不必在每次创建新的虚拟环境时都进行检查。
2014年

2
我有同样的问题。我的activate剧本是好的,但要注意所有pip*脚本和easy_install*脚本有错误的家当。它们都必须手动修复。我无法通过重新安装pip或类似方法修复它们。另外,还澄清了Joe Holloway的变通方法:问题不在于shell搜索pip,而是pip显式指定了错误的 python。因此,您需要自己指定python,如下所示:$ ~/.virtualenvs/venv/bin/python ~/.virtualenvs/venv/bin/pip --version
Neil Traft 2014年

在我的环境之后,我遇到了这个问题--relocatable,第42行是错误的,看起来--relocatable没有正确执行。
shellbye,2016年

4
当我重命名中间目录时,这发生在我身上,所以我不得不在'/ bin'中编辑激活脚本和pip脚本
joarleymoraes 16'Aug

16

对我来说,这不是点子或virtualenv问题。这是一个python问题。在网上学习了一些教程之后,我已经在〜/ .bash_profile(或〜/ .bashrc)中手动设置了$ PYTHONPATH。这个手动设置的$ PYTHONPATH在virtualenv中可用,因为应该允许它。

此外add2virtualenv,出于某种原因,我没有在virtualenv中将我的项目路径添加到$ PYTHONPATH中。

只是为那些可能仍陷于困境的人提供了一些分叉路径!干杯!


11

我遇到了同样的问题,我通过删除venv目录并重新创建来解决了它!

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

现在,一切都像魅力。


我在使用pip3virtualenv时,默认情况下使用的是python2,因此使用pip而不是pip3。我检查bin找不到pip3。使用virtualenv -p python3 venv解决了问题。
subtleseeker

这解决了我的问题。Pycharm的自动virtualenv创建无法正常工作。手动安装可以解决问题。谢谢。
Loaderon

5

我也有这个问题。pip install <package_name>/bin我的Mavericks Mac上的Python 3.3虚拟环境中的目录调用会导致将Python程序包安装在Python 2.7全局站点程序包目录中。尽管我的$ PATH从包含目录开始pip。奇怪的。在CentOS上不会发生这种情况。对我来说,解决方案是致电pip3而不是pip。当我已经安装了PIP通过在虚拟环境中ez_setup,三“画中画”的可执行文件已被安装在/bin目录- pippip3pip3.3。奇怪的是,所有三个文件都完全相同。呼唤pip3 install <package_name>导致将Python软件包正确安装到本地site-packages目录中。pip使用完整路径名调用虚拟环境也可以正常工作。我想知道为什么我的Mac为什么不像我期望的那样使用$ PATH。


5

首先要检查的是点子要解析到的位置:

which pip

如果您处于virtualenv中,则可以期望得到以下信息:

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

但是,由于某种原因,它可能会解决您的系统问题。例如,您可能在virtualenv中看到了这一点(这很不好):

/ usr / local / bin / pip(或您的virtualenv路径中没有的任何内容)。

要解决此问题,请在以下位置检查您的pipconfig:

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

并确保没有任何东西可以强迫您的Python路径或pip路径(这对我来说是固定的)。

然后尝试启动新终端并重建您的virtualenv(删除然后重新创建)


2
还要检查/etc/pip.conf!我遇到了类似的问题,经过大量调试后,发现有人通过弄乱该文件来错误配置了我正在使用的系统。
t.animal

我正在使用Arch Linux。我认为/etc/pip.conf是由操作系统设置的。
Q. Qiao

谢谢!你救了我的一天!这些配置就像隐藏在文件系统中的幽灵
MewX

2
我有一个终端会话定义的别名会覆盖pip,由于某些原因which pip,它仍然为我提供了正确的路径!
Matteo,

4

我在virtualenv中安装python软件包时遇到了同样的问题。在我看来,根本原因是不同的。在virtualenv内部,我(在Ubuntu上已不习惯)正在执行以下操作:

sudo easy_install -Z <package>

这导致bin / pip shebang被忽略,它使用根目录的non virtualenv python将其安装在全局站点程序包中。由于我们具有虚拟环境,因此我们应该在安装软件包时不要使用“ sudo”


4

我偶然发现了运行Manjaro的相同问题。我使用创建了虚拟环境python3 -m ven venv,然后使用激活了该环境source venv/bin/actiavewhich python并且which pip都对在virtualenv中正确的二进制文件指出,但是我无法安装到virtualenv中,使用二进制文件的完整路径时也是如此。原来,当我使用sudo pacman -R python-pip python-reportlab(必须包括reportlab来满足依赖关系)卸载python-pip软件包时,一切都按预期开始工作。不知道为什么,但这可能是由于系统软件包优先的双重安装。


我在Manjaro上也遇到了这个问题,并以相同的方式解决了它。解决后,我python-pip通过pamac 重新安装,virtualenv pip继续正常运行。不确定到底发生了什么,但我同意您对双重安装问题的评估。
sid

3

更新到后,我遇到了类似的问题pip==8.0.0。不得不诉诸调试pip来找出错误的路径。

事实证明,我的配置文件目录中有一个distutils配置文件,其中包含一些空路径值。这导致所有软件包都安装到同一根目录,而不是适当的虚拟环境(在我的情况下/lib/site-packages)。

我不确定配置文件如何到达那里或它是否具有空值,但是它在更新pip之后开始。

万一其他人偶然发现相同的问题,只需删除文件~/.pydistutils.cfg(或删除空的配置路径)即可解决我的环境中的问题,因为pip返回了默认的分布式配置。


1
这也是我的问题。我的文件看起来像这样,不知道它是如何到达的:[install]\nprefix=
foslock

1
@foslock是的,那也是我的样子。坏消息哈哈!
Josiah Ruddell '16


3

我在安装了python 2和3的macOS上遇到了相同的问题。

另外,我的别名也指向我的python3和pip3 .bash_profile

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

删除别名并使用python3 -m venv venv解决方案重新创建虚拟环境。


macos python安装是不必要的痛苦恕我直言
iomv

我正在拔头发,这终于为我解决了问题:“哪个点”显示了问题,“非别名点”修复了问题。
科林

1

今天遇到了同样的问题。我只是使用sudo easy_install pip(OSX / Max)在全球范围内重新安装了pip ,然后使用再次创建了virtualenv sudo virtualenv nameOfVEnv。然后,在激活新的virtualenv之后,该pip命令将按预期工作。

我不认为我sudo在第一次使用virtualenv时就使用过,这可能是无法pip从virtualenv内部进行访问的原因,pip2尽管很奇怪,但我仍能够在此修复程序之前进行访问。


我得到这个是因为我将目录移到了另一个路径,并且需要virtualenv再次运行
citynorman

1

以下是一些在使用虚拟环境时可以避免头痛的做法

  • 为您的项目创建一个文件夹。
  • 在此文件夹中创建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,第1行(She Bang)

bin / activate,第42行(VIRTUAL_ENV)


1

我有这个问题。原来,我的一个文件夹名称中有一个空格引起了问题。我删除了空间,使用venv删除并重新实例化,一切都很好。


1

创建virtualenv实例,然后更改父文件夹名称时,会发生此问题。


1

以上解决方案均不适用于我。

我的静脉活跃。 pip -Vwhich pip给了我正确的virtualenv路径,但是当我pip install使用激活的venv打包软件包时,我却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中。


1

创建虚拟环境后,尝试使用位于yourVirtualEnvName \ Scripts中的 pip

它应该在您的虚拟环境中的Lib \ site-packages内部安装一个软件包


0

我也有这个问题。调用sudo pip install导致将Python软件包安装在全局站点软件包目录中,并且调用pip install工作正常。因此,在virtualenv中不要使用sudo


或者,如果您使用sudo,则还必须激活虚拟环境。sudo su其次是<venv>/bin/activate其次pip install
戴夫

0

一样的问题。从Linux安装了Python3.5和pip 8.0.2 rpm

我没有找到主要原因,因此无法给出正确的答案。似乎有多种可能的原因。

但是,希望我能帮助分享我的观察结果和解决方法。

  1. pyvenv--system-site-packages

    • ./bin不包含pippip可从系统站点程序包获得
    • 软件包已全局安装(错误?
  2. pyvenv 没有 --system-site-packages

    • pip被安装成./bin,但它是一个不同的版本(从ensurepip
    • 软件包安装在虚拟环境中(确定

显而易见的解决方法pyvenv--system-site-packages

  • 不带--system-site-packages选项创建
  • 更改include-system-site-packages = falsetruepyvenv.cfg文件

0

同样值得检查的是,您没有以某种方式修改虚拟环境的路径。

在这种情况下,第一行bin/pip(以及其他可执行文件)将具有错误的路径。

您可以编辑这些文件并修复路径,也可以删除并重新安装virtualenv。


0

对于Python 3ers

尝试更新。我也遇到了同样的问题,并尝试了蔡斯的答案,但是没有成功。重构此问题的最快方法是,如果可能的话,更新您的Python Minor / Patch版本。我注意到我正在运行3.5.1,并更新为3.5.2。皮文夫再次工作。


0

当我在错误的位置创建virtualenv时,这发生在我身上。然后我以为我可以将目录移动到另一个位置,而不必担心。这很重要。

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

糟糕,我忘记了projects在创建virtualenv和克隆代表之前的CD 。哦,好吧,我太懒惰了,无法销毁和重建。我将毫无问题地移动目录。

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

不,要更多权限,这是什么?我以为这很奇怪,但是SUDO AWAY!然后,将软件包安装到全局位置。

我吸取的教训是,只需删除virtualenv目录。不要动它。


0

安装Divio后出现此问题:启动终端时,它以某种方式更改了我的PATH或环境。

在这种情况下,解决方案只是要做source ~/.bash_profile,应该已经设置好让您回到原始的pyenv / pyenv-virtualenv状态。


0

当我使用--python=python3.6flag 安装virtualenv时,它发生了,但是后来尝试使用pip2 install
使用将要使用的版本标记创建virtualenv可以解决权限问题。要检查,请尝试which pipwhich pip2which pip3(取决于您的选择)。如果pip您使用任何显示路径到venv这里不是您的问题。


0

以某种方式在项目文件夹中带有前缀=“”的setup.cfg文件

在项目文件夹外部的virtualenv上运行pip install起作用,因此从内部告诉pip使用空前缀,默认为“ /”

删除文件修复


0

我遇到了这个问题,在尝试了上述所有解决方案之后,我只是删除了所有内容并重新开始。

就我自己而言,我曾用于sudo创建其中存在虚拟环境的文件夹之一,而sudo将特权授予root用户。

我很生气!但这有效!


0

由于某种原因,我必须使用'sudo'通过ubuntu系统上的pip安装软件包。这导致程序包被安装在全局站点程序包中。将其放在此处,供将来可能会遇到此问题的任何人使用。


0

标题确实有问题,我已解决。在清理PATH之后,Pip开始安装在venv站点软件包中:它一开始就具有指向我本地〜/ bin目录的路径。

因此,我的建议是:彻底检查环境变量中是否存在“垃圾”或任何非标准的东西。不幸的是,virtualenv对那些敏感。

祝好运!


0

简短的答案是运行带有参数“ -no-site-packages”的命令virtualenv。

长答案,带解释:-

因此,在各处运行并经过很多线程后,我发现自己是个问题。上面的答案已经给出了这个想法,但是我还是想再讲一遍。

  • 问题在于,即使您正在激活环境,它也是由于我们创建virtualenv的方式而指向系统环境。

  • 当我们运行命令virtualenv env -p python3时 ,它将安装virtualenv,但不会创建no-global-site-packages.txt。

  • 因此,当您通过source activate命令激活环境时,该文件名为site.py(名称可以不同,我只是忘记了),该文件运行并检查该文件是否不存在,不会将您的环境路径添加到sys.path中。并使用系统python。

  • 要解决此问题,只需运行带有附加参数的virtualenv-无站点包,它将创建该文件,并且在激活环境时,它将在PATH变量中添加自定义环境路径,以使其可访问。


0

上面有很多很好的讨论,但是使用了virtualenv示例。由于“ conda”现在是管理virtualenv的推荐工具,因此,我总结了在conda env中运行pip的步骤,如下所示。

我将使用py36r作为环境的名称,并且/ opt / conda / 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

请注意,执行的点数应位于/opt/conda/envs/py36r/bin/pip(而不是/opt/conda/bin/pip)中。

另外,您可以简单地运行以下内容而不激活conda

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

另外,如果使用conda安装,则无需激活即可安装:

$ conda install -n py36r pkg_abc ...

0

视窗

对我而言,解决方案不是使用 mkvirtualenv,而是:

python -m venv path/to/your/virtualenv

workon正常工作。

在virtualenv中时:pip -V显示virtualenv的pip路径

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.