在全球网站包中安装pip而不是virtualenv

时间:2014-01-06 15:03:08

标签: python macos virtualenv pip

使用pip在virtualenv中安装软件包会导致软件包安装在全局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

更改了.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将安装在全局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(遵循these指令),并且Python3也存在同样的问题。尽管如此,在基于Python2的virtualenv中安装软件包仍能完美无缺。

任何提示,提示......都将非常感激。

33 个答案:

答案 0 :(得分:72)

有趣的是你带来了这个,我只是遇到了同样的问题。我最终解决了这个问题,但我仍然不确定是什么造成的。

尝试检查您的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 trying to install packages globally

答案 1 :(得分:15)

对我而言,这不是一个小问题或虚拟问题。这是一个蟒蛇问题。在线上学习了一些教程之后,我在〜/ .bash_profile(或〜/ .bashrc)中手动设置了我的$ PYTHONPATH。这个手动设置的$ PYTHONPATH在virtualenv中可用,因为它可能应该被允许。

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

对于那些可能仍然被卡住的人来说,只是一些分叉路径!干杯!

答案 2 :(得分:7)

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

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

现在一切都像魅力一样。

答案 3 :(得分:5)

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

此外,我在.bash_profile中也有别名指向python3和pip3。

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

使用python3 -m venv venv删除别名并重新创建虚拟环境可以解决此问题。

答案 4 :(得分:4)

我也有这个问题。在我的Mavericks Mac上的Python 3.3虚拟环境中的pip install <package_name>目录中调用/bin导致Python包安装在Python 2.7全局站点包目录中。尽管我的$ PATH始于包含pip的目录。奇怪的。这不会发生在CentOS上。对我来说,解决方案是调用pip3而不是pip。当我通过 ez_setup 在虚拟环境中安装 pip 时,/bin目录中已安装了三个“pip”可执行文件 - pip,{ {1}}和pip3。奇怪的是,这三个文件完全相同。调用pip3.3导致Python包正确安装到本地site-packages目录中。将具有完整路径名的pip3 install <package_name>调用到虚拟环境中也能正常工作。我有兴趣知道为什么我的Mac没有像我期望的那样使用$ PATH。

答案 5 :(得分:4)

我在virtualenv中安装python包时遇到了同样的问题。 我案例的根本原因是不同的。 从virtualenv中,我(出于Ubuntu的习惯),做:

sudo easy_install -Z <package>

这导致bin / pip shebang被忽略,它使用root的非virtualenv python将它安装在全局站点包中。 由于我们有虚拟环境,我们应该安装没有“sudo”的软件包

答案 6 :(得分:4)

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

答案 7 :(得分:3)

更新到pip==8.0.0后,我遇到了类似的问题。不得不求助于调试pip来追踪坏路径。

事实证明我的个人资料目录有一个带有一些空路径值的distutils配置文件。这导致所有软件包安装到相同的根目录而不是相应的虚拟环境(在我的情况下为/lib/site-packages)。

我不确定配置文件是如何到达的,或者它是如何具有空值但是在更新pip后它就开始了。

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

答案 8 :(得分:2)

首先要检查的是哪个位置点正在解析:

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

如果你是一个virtualenv,你会期望这给你一些像:

  

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

然而,由于某种原因,它可能会解决您的系统点。例如,您可以在virtualenv中看到这个(这很糟糕):

  

的/ usr / local / bin中/ PIP   (或者你的virtualenv路径中没有任何东西)。

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

<ComboBox 
    DisplayMemberPath="ItemName" 
    SelectedValuePath="ItemName"                            
    ItemsSource="{Binding Path=PathToProperty,
    RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}"
</ComboBox>

并确保没有任何东西强迫你的Python路径或你的pip路径(这为我修复了它)。

然后尝试启动一个新终端并重建你的virtualenv(删除然后再创建它)

答案 9 :(得分:1)

以下是一些可以避免在使用虚拟环境

时出现问题的做法
  • 为您的项目创建一个文件夹。
  • 在此文件夹中创建 Virtualenv 项目。
  • 激活项目环境后,请勿使用&#34; sudo pip install package &#34;。
  • 完成工作后,始终&#34; 停用&#34;你的环境。
  • 避免重命名项目文件夹。


为了更好地表示这种做法,这里有一个模拟:


为您的项目/环境创建文件夹

$ 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 时,您将运行Virtualenv作为 root ,转义已创建的整个环境,然后在全局站点包上安装该程序包,<虽然您已经激活了环境,但是在您拥有虚拟环境的项目文件夹中没有。>

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

  

...您必须从项目的 bin 目录中的某些文件调整一些变量。

     

例如:

     

bin / pip,第1行(She Bang)

     

bin / activate,第42行(VIRTUAL_ENV)

答案 10 :(得分:1)

创建虚拟环境后,尝试使用 yourVirtualEnvName \ Scripts

中的pip

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

答案 11 :(得分:1)

以上解决方案均不适合我。

我的venv很活跃。 pip -Vwhich pip给了我正确的virtualenv路径,但当我pip install - ed激活的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中。

答案 12 :(得分:1)

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

答案 13 :(得分:1)

我有这个问题。事实证明,我的一个文件夹名称中有一个空格导致了问题。我删除了空间,删除并使用venv重新实现,一切都很顺利。

答案 14 :(得分:1)

我在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行的右侧

答案 15 :(得分:1)

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

我不认为我在第一次使用virtualenv时使用sudo,这可能是因为无法从virtualenv中访问pip,我可以访问{ {1}}在此修复之前虽然很奇怪。

答案 16 :(得分:0)

  1. 激活虚拟环境
  2. 使用 where pip 找出 pip 位置,如果在 base env 中,可能 'pip' 不是 安装
  3. 类型
<块引用>

conda 安装 pip

享受吧!

答案 17 :(得分:0)

WINDOWS

对我来说不使用解决方案 mkvirtualenv,但:

python -m venv path/to/your/virtualenv

workon正常工作。

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

答案 18 :(得分:0)

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

长解释性答案:-

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

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

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

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

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

答案 19 :(得分:0)

我也遇到了这个问题,困扰了我很长时间,直到我按照@Chase Ries方法解决了。

解决问题的关键是:

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

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

如果错了,先更正deactivate,然后再纠正. bin/activate,如果我们的共同问题有相同的原因,那么它应该可以解决。

下面,我将在Ubuntu环境中详细解释此过程,对于WindowsMacOS也是如此。

这句话的意思是我们需要检查虚拟环境中#!/path/python文件的第一行bin/pip是否正确。

最初在我的文件中显示:

#!/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命令可以正常执行。

因此,对我而言,此问题的原因是虚拟环境所在的文件夹的路径已更改(这是以前组织文件夹时留下的秘密问题)。

但是,由于虚拟环境所在的文件夹位置的更改,可能会出现许多路径错误,因此最简单的方法是将虚拟环境所在的文件夹还原到原始位置。 / p>

答案 20 :(得分:0)

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

我将使用py36r作为环境的名称,/ opt / conda / envs是环境的前缀):

$ source /opt/conda/etc/profile.d/conda.sh#如果已完成,则跳过

$ conda激活py36r

$ pip安装pkg_xyz

$点列表| grep pkg_xyz

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

或者,您可以简单地运行以下命令而无需激活conda

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

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

$ conda install -n py36r pkg_abc ...

答案 21 :(得分:0)

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

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

祝你好运!

答案 22 :(得分:0)

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

答案 23 :(得分:0)

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

在我自己的情况下,我使用sudo创建其中存在虚拟环境的文件夹之一,而sudo将特权授予root用户

我很生气!但这有效!

答案 24 :(得分:0)

转到虚拟环境中的bin目录,并这样写:

./pip3 install <package-name>

答案 25 :(得分:0)

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

答案 26 :(得分:0)

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

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

删除固定的文件

答案 27 :(得分:0)

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

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

答案 28 :(得分:0)

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

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

哦,废话,我忘了在创建virtualenv并克隆代表之前进入projects。哦,我太懒了,不能破坏和重建。我会毫不犹豫地移动目录。

cd ~
mv myenv projects
cd projects/myenv/myrepo
pip install -r requirements
不,想要更多权限,是什么? 我觉得这很奇怪,但是SUDO AWAY!然后,它将软件包安装到全球位置。

我学到的教训是,删除virtualenv目录。不要移动它。

答案 29 :(得分:0)

对于Python 3ers

尝试更新。我有同样的问题,并尝试了Chases&#39;回答,但没有成功。重构的最快方法是尽可能更新Python Minor / Patch版本。我注意到我运行3.5.1并更新到3.5.2。 Pyvenv再次奏效。

答案 30 :(得分:0)

还值得检查一下,你并没有以某种方式修改你的virtualenv的路径。

在这种情况下,bin/pip中的第一行(以及其余可执行文件)的路径不正确。

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

答案 31 :(得分:0)

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

我没有找到主要原因,也无法给出正确答案。看起来有多种可能的原因。

但是,我希望我可以帮助分享我的观察和解决方法。

  1. pyvenv--system-site-packages

    • ./bin不包含pippip可从系统网站套件获取
    • 包全局安装( BUG?
  2. pyvenv没有--system-site-packages

    • pip已安装到./bin,但它是一个不同的版本(来自ensurepip
    • 软件包安装在虚拟环境中(确定
  3. 使用pyvenv的{​​{1}}的明显解决方法:

    • 在没有--system-site-packages选项
    • 的情况下创建它
    • --system-site-packages档案
    • 中将include-system-site-packages = false更改为true

答案 32 :(得分:0)

我也有这个问题。调用sudo pip install导致Python包安装在全局site-packages目录中,并且调用pip install工作正常。 所以不要在virtualenv中使用 sudo