使用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 pip
和which 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中安装软件包仍能完美无缺。
任何提示,提示......都将非常感激。
答案 0 :(得分:72)
有趣的是你带来了这个,我只是遇到了同样的问题。我最终解决了这个问题,但我仍然不确定是什么造成的。
尝试检查您的bin/pip
和bin/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及其完整路径(即不依赖于搜索可执行路径),您甚至不需要激活环境。它会做正确的事。
也许并不理想,但它应该在紧要关头工作。
链接到我原来的问题:
答案 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 python
和which 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)
以下是一些可以避免在使用虚拟环境
时出现问题的做法
为了更好地表示这种做法,这里有一个模拟:
$ 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
>>>
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 -V
和which 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
set "VIRTUAL_ENV=path_to_venv\venv"
11行$env:VIRTUAL_ENV="path_to_venv\venv"
30行#!d:\path_to_env\venv\scripts\python.exe
,此行位于文件末尾,在我的情况下,移至667行右侧,我正在研究光盘d,所以路径的开头就是它的字母#!d:\path_to_env\venv\scripts\python.exe
,此行位于文件的末尾,在我的情况下,移至667行的右侧#!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)
where pip
找出 pip 位置,如果在 base env 中,可能 'pip' 不是
安装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/pip
和bin/activate
脚本。在bin/pip
中,查看shebang。这是对的吗?如果不是,请更正它。然后在42
中的〜bin/activate
行中,检查您的virtualenv路径是否正确。看起来像这样VIRTUAL_ENV="/Users/me/path/to/virtual/environment"
如果错了,先更正
deactivate
,然后再纠正. bin/activate
,如果我们的共同问题有相同的原因,那么它应该可以解决。
下面,我将在Ubuntu
环境中详细解释此过程,对于Windows
和MacOS
也是如此。
这句话的意思是我们需要检查虚拟环境中#!/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 pip
或which pip2
或which 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。
我没有找到主要原因,也无法给出正确答案。看起来有多种可能的原因。
但是,我希望我可以帮助分享我的观察和解决方法。
pyvenv
与--system-site-packages
./bin
不包含pip
,pip
可从系统网站套件获取 pyvenv
没有--system-site-packages
pip
已安装到./bin
,但它是一个不同的版本(来自ensurepip
)使用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 。