使用Python虚拟环境 `virtualenv` 安装本地包 `--system-site-packages`。

11

我知道这个话题被反复讨论过,但是我在SO或其他地方没有找到解决问题的方法,所以我怀疑我的系统中可能存在bug。

我正在使用Python 3.4开发一个应用程序,该应用程序将在旧版RHEL 6平台上运行,并使用Qt。我已经通过yum安装了所有相关库(例如qt-devel,pyqt4-devel等),现在想要将我的应用程序包安装为“可编辑”包,使用pip install -e mypkg命令。我还有一些依赖要求,这些要求不在yum上,必须通过pip进行安装。

我想做的是创建一个虚拟环境,它“继承”了通过yum安装的系统包,但允许我将自己的包pip安装到我的主目录中的虚拟环境目录中。

从我的谷歌搜索结果来看,最好的方法是创建一个虚拟环境,其中包含系统的site-packages目录:

$ python3 -m venv --system-site-packages ~/venv

然而,当我尝试将包安装到此虚拟环境的site-packages目录时,它会尝试在/usr/lib下安装它,然后我会收到权限被拒绝的错误。
因此,似乎--system-site-packages选项使我的虚拟环境完全共享系统的site-packages目录,而不是将其用作“基础”,可以在其上添加更多的包。
这个答案链接指出使用pip install -I应该可以做到我想要的,但事实并非如此。
(venv) $ pip3 install -I bitstring
...
error: could not create '/usr/lib/python3.4/site-packages/bitstring.py': Permission denied

你在尝试再次使用pip之前是否激活了虚拟环境? - marcanuy
1
@marcanuy 是的,我试图通过我的提示符字符串中的 (venv) 来表示这一点。 - gpanders
你确定需要配置虚拟环境来使用系统包吗?我记得通过 yumapt 安装的包即使在没有启用系统包的情况下也可以在虚拟环境中使用(当时让我感到非常惊讶)。至少应该进行测试。 - jpmc26
@jpmc26 看起来很合理,但恐怕情况并非如此:>>> import sys; print(sys.path) 显示 ['', '/usr/lib64/python34.zip', '/usr/lib/python3.4', '/usr/lib64/python3.4/plat-linux', '/usr/lib64/python3.4/lib-dynload', '$HOME/venv/lib64/python3.4/site-packages', '$HOME/venv/lib/python3.4/site-packages'],缺少 /usr/lib64/python3.4/site-packages - gpanders
@GregAnders 不,不是的。只需要尝试导入模块即可。例如:from PyQt4 import QtGui。如果无法工作,那就算了,但我记得它可以(至少在某些情况下)。也许它被安装到了列表中的其他位置之一。 - jpmc26
1
@jpmc26 我尝试使用numpy(也是通过yum安装的),但出现了“ImportError: No module named 'numpy'”错误。 - gpanders
2个回答

19

创建虚拟环境时不要使用--system-site-packages开关。创建完环境后,进入该环境所在的文件夹。该文件夹应该有一个名为pyvenv.cfg的文件。编辑这个文件。它包含了(除其他文本外)一行:

include-system-site-packages = false

将此行更改为:

include-system-site-packages = true

激活环境。模块的安装现在将进入虚拟环境,系统的站点包也可见。


https://stackoverflow.com/a/40989759/8676953 可能也是一个很好的答案,因为它提供了相应问题的链接。 - de1
我该如何设置只共享某些库? - GoingMyWay

4

在Python 3.8中,--system-site-packages 看起来可以正常工作:

python3 -m venv --system-site-packages myProject
cat myProject/pyvenv.cfg 

home = /usr/bin
include-system-site-packages = true
version = 3.8.5

安装完astroid, isort, wrapt之后,我收到以下错误信息:
pip list -v
Package                Version              Location                                                Installer
---------------------- -------------------- ------------------------------------------------------- ---------
apturl                 0.5.2                /usr/lib/python3/dist-packages                                   
astroid                2.4.2                /home/to/no/MR/auto-gen/lib/python3.8/site-packages pip      
isort                  5.6.4                /home/to/no/MR/auto-gen/lib/python3.8/site-packages pip      
jedi                   0.15.2               /usr/lib/python3/dist-packages                                   
keyring                18.0.1               /usr/lib/python3/dist-packages                                   
wrapt                  1.12.1               /home/to/no/MR/auto-gen/lib/python3.8/site-packages pip

已经安装的“系统”软件包来自于/usr/lib/python3/dist-packages,而本地(venv)安装的软件包来自于:/home/to/no/MR/auto-gen/lib/python3.8/site-packages


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接