pip 在全局站点包中安装而不是在虚拟环境中安装
- 2025-02-27 09:05:00
- admin 原创
- 81
问题描述:
使用pip3
安装包virtualenv
会导致包安装在全局 site-packages 文件夹中,而不是虚拟环境文件夹中。以下是我在 OS X Mavericks (10.9.1) 上设置 Python3 和虚拟环境的方法:
我使用 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
(重新启动 shell 后)。
注意:which python3
仍然返回/ usr/bin/python
。
virtualenv
使用以下方式安装pip3
:
pip3 install virtualenv
接下来创建一个新的virtualenv
并激活它:
virtualenv testpy3 -p python3
cd testpy3
source bin/activate
注意:如果我不指定 -p python3,则虚拟环境的 bin 文件夹中将会缺少 pip。
运行which pip
并which pip3
都返回 virtualenv 文件夹:
/Users/kristof/VirtualEnvs/testpy3/bin/pip3
现在,当我尝试在激活的虚拟环境中使用 pip 安装 Markdown 时,pip 将安装在全局 site-packages 文件夹中,而不是虚拟环境的 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 的虚拟环境中安装软件包却没有出现任何问题。
如能提供任何提示、暗示……我将非常感激。
解决方案 1:
有趣的是,你提到了这一点,我刚刚遇到了完全相同的问题。我最终解决了它,但我仍然不确定是什么原因造成的。
尝试检查你的bin/pip
和bin/activate
脚本。在 中bin/pip
,查看 shebang。它正确吗?如果不正确,请更正它。然后在 中的 ~ 行42
,bin/activate
检查虚拟环境路径是否正确。它看起来像这样
VIRTUAL_ENV="/Users/me/path/to/virtual/environment"
如果错了,就改正,deactivate
然后. bin/activate
,如果我们共同的问题有相同的原因,它应该可以工作。如果仍然不行,无论如何,你走在正确的轨道上。我和你一样经历了同样的问题解决程序,which pip
一遍又一遍地执行,跟踪堆栈跟踪等。
确保
/Users/kristof/VirtualEnvs/testpy3/bin/pip3
是您想要的,而不是引用另一个类似名称的测试项目(我遇到了这个问题,不知道它是如何开始的。我怀疑是同时运行多个虚拟环境)。
如果这些都不起作用,那么一个临时的解决方案可能是,正如乔·霍洛威所说,
只需使用完整路径运行虚拟环境的 pip(即不依赖于搜索可执行文件路径),您甚至不需要激活环境。它会做正确的事情。
或许并不理想,但在关键时刻应该能起到作用。
链接到我的原始问题:
VirtualEnv/Pip 尝试全局安装软件包
解决方案 2:
我遇到了同样的问题,我通过删除 venv 目录并重新创建它解决了它!
deactivate (if venv is activated first deactivate it)
rm -rf venv
virtualenv -p python3 venv
. ENV/bin/activate
pip3 install -r requirements.txt
现在一切都运行顺利。
编辑:这是针对 Python3 的 venv 修改的上述代码:
deactivate # (if venv is activated first deactivate it)
rm -rf venv # Delete the old venv directory
python3 -m venv venv # Recreate a new, empty venv
. venv/bin/activate # Activate it
pip3 install -r requirements.txt # Install the dependencies
解决方案 3:
对我来说,这不是 pip 或虚拟环境的问题。这是 Python 的问题。我按照网上的一些教程,在 ~/.bash_profile(或 ~/.bashrc)中手动设置了 $PYTHONPATH。这个手动设置的 $PYTHONPATH 在虚拟环境中可用,因为它可能应该被允许。
此外add2virtualenv
,由于某种原因,在虚拟环境中没有将我的项目路径添加到我的 $PYTHONPATH 中。
对于那些可能仍陷于困境的人来说,这只是一些岔路!干杯!
解决方案 4:
首先要检查的是 pip 解析到哪个位置:
which pip
如果你处于虚拟环境中,你可能会期望得到如下结果:
/path/to/virtualenv/.name_of_virtualenv/bin/pip
但是,出于某种原因,它可能解析为您的系统 pip。例如,您可能会在虚拟环境中看到此信息(这很糟糕):
/usr/local/bin/pip (或任何不在您的虚拟环境路径中的内容)。
要解决此问题,请检查您的 pipconfig:
~/.pipconf
~/.conf/pip
/etc/pip.conf
并确保没有任何内容强制执行您的 Python 路径或 pip 路径(这为我解决了这个问题)。
然后尝试启动一个新终端并重建你的虚拟环境(删除然后再次创建)
解决方案 5:
进入虚拟环境中的 bin 目录并写入如下内容:
./pip3 install <package-name>
解决方案 6:
我在安装了 Python 2 和 3 的 macos 上遇到了同样的问题。
另外,我在我的 中有别名指向 python3 和 pip3 .bash_profile
。
alias python=/usr/local/bin/python3
alias pip=/usr/local/bin/pip3
删除别名并重新创建虚拟环境可以python3 -m venv venv
解决问题。
解决方案 7:
我也遇到过这个问题。从 Mavericks Mac 上的 Python 3.3 虚拟环境中的目录调用会导致 Python 包安装在 Python 2.7 全局站点包目录中。尽管我的 $PATH 以包含 的目录开头,但情况仍然如此pip install <package_name>
。奇怪的是,这在 CentOS 上不会发生。对我来说,解决方案是调用而不是。当我通过ez_setup在虚拟环境中安装pip时,目录中安装了三个“pip”可执行文件- 、和。奇怪的是,这三个文件完全相同。调用导致 Python 包正确安装到本地站点包目录中。使用完整路径名调用虚拟环境也能正常工作。我很想知道为什么我的 Mac 没有按照我期望的方式使用 $PATH。/bin
`pippip3
pip/bin
pippip3
pip3.3pip3 install <package_name>
pip`
解决方案 8:
我在虚拟环境中安装 Python 包时遇到了同样的问题。我的情况的根本原因不同。在虚拟环境中,我(出于 Ubuntu 的习惯)执行以下操作:
sudo easy_install -Z <package>
这导致 bin/pip shebang 被忽略,并使用 root 的非虚拟环境 python 将其安装在全局站点包中。由于我们有一个虚拟环境,因此我们应该在不使用“sudo”的情况下安装包
解决方案 9:
创建虚拟环境实例然后更改父文件夹名称时会出现此问题。
解决方案 10:
我在运行 Manjaro 时遇到了同样的问题。我使用 创建了虚拟环境python3 -m ven venv
,然后使用 激活了它source venv/bin/actiave
,which python
两者which pip
都指向了虚拟环境中的正确二进制文件,但是我无法安装到虚拟环境中,即使使用二进制文件的完整路径也是如此。事实证明,当我使用 卸载 python-pip 包时sudo pacman -R python-pip python-reportlab
(必须包含 reportlab 以满足依赖关系),一切都开始按预期工作。不知道为什么,但这可能是由于双重安装导致系统包优先。
解决方案 11:
更新到 后,我遇到了类似的问题pip==8.0.0
。不得不借助调试 pip 来找出错误路径。
事实证明,我的配置文件目录中有一个 distutils 配置文件,其中有一些空路径值。这导致所有包都安装到同一个根目录,而不是适当的虚拟环境(在我的情况下/lib/site-packages
)。
我不确定配置文件是如何到达那里的,或者它是如何有空值的,但它在更新 pip 后启动了。
如果其他人遇到同样的问题,只需删除文件~/.pydistutils.cfg
(或删除空的配置路径)即可解决我环境中的问题,因为 pip 恢复了默认的分布式配置。
解决方案 12:
以下是使用虚拟环境时可以避免麻烦的一些做法:
为您的项目创建一个文件夹。
在此文件夹内创建您的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 ,退出已创建的整个环境,然后将包安装在全局 site-packages 上,而不是安装在具有虚拟环境的项目文件夹中,尽管您已激活该环境。
如果您重命名项目的文件夹(如接受的答案中所述)......
...您必须从项目的bin目录内的某些文件中调整一些变量。
例如:
bin/pip,第 1 行(She Bang)
bin/activate,第 42 行(VIRTUAL_ENV)
解决方案 13:
今天遇到了同样的问题。我只是用sudo easy_install pip
(OSX/Max) 全局重新安装了 pip,然后用 再次创建了我的虚拟环境sudo virtualenv nameOfVEnv
。然后在激活新的虚拟环境后,pip
命令按预期工作。
我认为我没有sudo
在第一次创建虚拟环境时使用过它,这可能是无法从虚拟环境内部访问的原因,但在修复之前pip
我可以访问它,这很奇怪。pip2
解决方案 14:
我遇到了这个问题。原来是我的一个文件夹名称中有一个空格,导致了这个问题。我删除了空格,删除并使用 venv 重新实例化,一切正常。
解决方案 15:
上述解决方案对我都不起作用。
我的 venv 处于活动状态, pip -V
并which pip
给了我正确的虚拟环境路径,但是当我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 中。
解决方案 16:
创建虚拟环境后,尝试使用位于yourVirtualEnvName\Scripts中的 pip
它应该在你的虚拟环境中的Lib\site-packages中安装一个包
解决方案 17:
我在 Windows 上也遇到过类似的问题。这是由于在项目中重命名虚拟环境文件夹名称内的文件夹结构而导致的。文件中的路径没有改变,而是保持了创建虚拟环境时的原样。正如 Chase Ries 提到的,我已将文件中的 VIRTUAL_ENV 和 python.exe 路径更改为
./venv/Scripts/activate.bat,
set "VIRTUAL_ENV=path_to_venvenv"
文件中第 11 行./venv/Scripts/Activate.ps1,
$env:VIRTUAL_ENV="path_to_venvenv"
文件中有 30 行./venv/Scripts/pip.exe,
#!d:path_to_envenvscriptspython.exe
此行位于文件末尾,在我的情况下,移动到第 667 行右侧,我正在使用磁盘 d,因此路径的开头是它的字母./venv/Scripts/pip3.7.exe,
#!d:path_to_envenvscriptspython.exe
此行位于文件末尾,在我的情况下,移动到第 667 行的右侧./venv/Scripts/pip3.exe,
#!d:path_to_envenvscriptspython.exe
此行位于文件末尾,在我的情况下,移动到第 667 行的右侧
解决方案 18:
我遇到了同样的问题。Pip 仅全局安装。这意味着 pip 的配置存在问题。
首先,找到 pip 配置文件:
python -m pip config debug
它将列出所有 pip 配置文件。如果为“false”(没有文件),请创建它(或添加行 respect - virtualenv = true):
[global]
default-timeout = 60
respect-virtualenv = true
download-cache = /tmp
log-file = /tmp/pip-log.txt
解决方案 19:
我也遇到过这个问题。调用sudo pip install
会导致 Python 包安装在全局 site-packages 目录中,并且调用pip install
工作正常。因此在 virtualenv 中无需使用sudo 。
解决方案 20:
同样的问题。从Linux安装的Python3.5和pip 8.0.2 rpm
。
我没有找到主要原因,无法给出正确答案。看起来有多种可能的原因。
不过,我希望通过分享我的观察和解决方法能够有所帮助。
pyvenv
和--system-site-packages
* `./bin`不包含`pip`,`pip`可从系统站点包中获得
* 软件包已全局安装(**BUG?**)
pyvenv
没有--system-site-packages
* `pip`安装到,但它是(来自)`./bin`不同的版本`ensurepip`
* 软件包已安装在虚拟环境中(**确定**)
明显的解决方法pyvenv
是--system-site-packages
:
--system-site-packages
不使用选项创建它更改
include-system-site-packages = false
为文件true
中pyvenv.cfg
解决方案 21:
还值得检查的是,您没有以某种方式修改虚拟环境的路径。
在这种情况下,第一行bin/pip
(以及其余的可执行文件)将具有不正确的路径。
您可以编辑这些文件并修复路径,或者删除并再次安装虚拟环境。
解决方案 22:
对于 Python 3 使用者
尝试更新。我遇到了完全相同的问题,并尝试了 Chases 的答案,但没有成功。重构此问题的最快方法是尽可能更新 Python 次要/补丁版本。我注意到我正在运行 3.5.1 并更新到 3.5.2。Pyvenv 再次正常工作。
解决方案 23:
当我在错误的位置创建虚拟环境时,发生了这种情况。然后我想我可以将目录移动到另一个位置,而这无关紧要。这很重要。
mkdir ~/projects
virtualenv myenv
cd myenv
git clone [my repository]
哦,糟糕,我忘了在创建虚拟环境和克隆 rep 之前 cd 进入projects
。哦,好吧,我太懒了,不想销毁并重新创建。我只需移动目录,就不会有问题了。
cd ~
mv myenv projects
cd projects/myenv/myrepo
pip install -r requirements
不,想要更多权限,什么?我觉得很奇怪,但是 SUDO AWAY!然后它将软件包安装到全局位置。
我学到的教训是,只需删除虚拟环境目录。不要移动它。
解决方案 24:
安装 Divio 后出现了这个问题:它以某种方式改变了我的 PATH 或环境,因为它启动了一个终端。
在这种情况下,解决方案就是执行source ~/.bash_profile
已经设置好的操作以使您回到原始的 pyenv/pyenv-virtualenv 状态。
解决方案 25:
在项目文件夹中以某种方式存在一个前缀为“”的setup.cfg文件
在项目文件夹外部的虚拟环境中运行 pip install 可以正常工作,因此从内部它告诉 pip 使用一个默认为“/”的空前缀
删除文件修复了这个问题
解决方案 26:
我遇到了这个问题,在尝试了上述所有解决方案后,我删除了所有内容并重新开始。
就我自己而言,我sudo
创建了虚拟环境所在的文件夹之一,并使用 sudo 赋予 root 权限
我很生气!但是它成功了!
解决方案 27:
由于某种原因,我必须使用“sudo”在我的 ubuntu 系统上通过 pip 安装软件包。这导致软件包安装在全局站点软件包中。将此内容放在这里,以供将来可能遇到此问题的任何人参考。
解决方案 28:
我遇到了与标题完全相同的问题,并且解决了它。在我清理 PATH 后,Pip 开始在 venv site-packages 中安装:它一开始就有一条指向我本地 ~/bin 目录的路径。
因此,我的建议是:彻底检查您的环境变量中是否存在“垃圾”或任何非标准内容。不幸的是,virtualenv 对这些很敏感。
祝你好运!
解决方案 29:
简短的回答是运行带有参数“—no-site-packages”的命令 virtualenv。
附有解释的长答案:-
因此,在四处奔波并浏览了很多帖子之后,我找到了问题所在。上面的答案给出了思路,但我还是想再把所有问题都重新考虑一遍。
问题是,即使你激活了环境,由于我们创建虚拟环境的方式,它指的是系统环境。
当我们运行命令virtualenv env -p python3时
,它将安装 virtualenv 但不会创建 no-global—site-packages.txt。因此,当您通过源激活命令激活环境时,会出现一个名为 site.py 的文件(名称可以不同,我只是忘记了),它会运行并检查,如果此文件不存在,它就不会将您的环境路径添加到 sys.path 并使用系统 python。
要解决此问题,只需使用额外参数 —no-site-packages 运行 virtualenv,它将创建该文件,当您激活环境时,它会将您的自定义环境路径添加到您的 PATH 变量中,使其可访问。
解决方案 30:
上面有很多很好的讨论,但使用了虚拟环境示例。由于“conda”现在是管理虚拟环境的推荐工具,我总结了在 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
请注意,执行的 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 ...
扫码咨询,免费领取项目管理大礼包!