Python - Virtual Environment uses System Directories Python的虚拟环境使用系统目录
Python - Virtual Environment uses System Directories Python的虚拟环境使用系统目录
我创建了一个Python虚拟环境,并通过以下方式激活它:
joe@joe-mint $ source ./venvs/deep-learning/bin/activate
这会将提示符变成:
(deep-learning) joe@joe-mint $
现在,每当我运行一个Python包或尝试安装一个包时,系统似乎忽略了它在虚拟环境中的事实,并在系统范围内进行操作:
(deep-learning) joe@joe-mint $ which pip /usr/local/bin/pip
当我尝试安装不在我的系统上的新包时,情况也是一样的;它们被安装到系统文件(即/usr/bin)而不是虚拟环境中。
我的虚拟环境出了什么问题?如何使它忽略系统文件并在环境内完成所有操作?
我查看了这个问题,其中提到可以在创建虚拟环境时使用一个显式标志,以使其使用本地环境包。但是我使用python-3.5 -m venv
创建虚拟环境,而这个标志在这个版本中被移除了,因为它现在是默认选项。
我还查看了这个问题,并确认虚拟环境的activate
文件中的VIRTUAL_ENV
变量设置正确。
问题出现的原因是:如果在没有本地pip安装的虚拟环境上运行pip命令,它默认使用虚拟环境外部系统的pip。即使已激活虚拟环境,它也会尝试在系统中安装包而不是在虚拟环境中安装。
解决方法如下:
首先,由于存在一个长期未解决的错误,我不得不在没有pip的情况下安装虚拟环境。
其次,按照指示在虚拟环境中安装pip。然而,这样做需要使用一些临时文件夹,由于某种原因,我的用户没有访问权限。因此,这个过程失败了,我唯一能让它工作的方法是以root身份运行。
sudo su activate ..../venvs/deep-learning/bin/activate curl --silent --show-error --retry 5 https://bootstrap.pypa.io/get-pip.py | python
尽管`which pip`现在指示使用了正确的pip(在虚拟环境中),但运行pip命令仍然使用系统的pip!通过取消激活(deactivate)和重新激活虚拟环境来解决这个问题。
现在,我花了一些时间才意识到以root身份安装导致我在虚拟环境内使用pip安装更多包时出现权限错误。
chown: -R ..../venvs/deep-learning/*
这就是解决方法。经过这些步骤,我可以激活虚拟环境并正确运行pip命令。它会使用虚拟环境内部的pip,并在虚拟环境中安装包。
对我来说,这个方法有效,但我还必须从$PYTHONPATH中删除系统Python路径,并用虚拟环境的路径替换它:$export PYTHONPATH=..../venvs/deep-learning/lib/python3.8/site-packages