如何将全局安装的包导入到virtualenv文件夹中

37
所以我有一个名为venv的虚拟环境文件夹,用于我的Python项目。
我可以运行:
venv/bin/pip install -r requirements.txt

安装除一个M2Crypto之外的所有项目所需的所有要求。唯一的安装方法是通过apt-get:

apt-get install python-m2crypto

我该如何将通过apt安装的软件包添加到venv文件夹中呢?

6个回答

47
--system-site-packages

提供对虚拟环境的全局 site-packages 模块的访问权限。

你可以执行以下操作:

$ sudo apt-get install python-m2crypto
$ virtualenv env --system-site-packages

...然后您将能够在您的virtualenv环境中访问m2crypto(以及所有其他系统范围内已安装的包)。


只要你小心地将你想要在全局共享的包安装到基本的Python安装中,这就是正确的方法。 - Silas Ray
但是,如果虚拟环境可以访问全局站点包,那么使用虚拟环境的意义在哪里? - Richard Knop
2
Richard Knop,你可以在自己的虚拟环境中安装额外的软件包,而不需要root权限,并且不会影响系统Python。 - Corey Goldberg
12
如果您的虚拟环境已经设置好,并且不想重新创建它,并且正在使用或愿意使用_virtualenvwrapper_来管理您的虚拟环境,那么您可以通过运行 toggleglobalsitepackages 命令 来添加对 --system-site-packages 的访问权限。注意,这个命令需要在后期运行。 - Kinsa
@RichardKnop 这有什么意义呢?这里有一个例子。我拥有多个项目和不同的库,但我为所有项目都使用 auto_py_to_exe - Lucem

29

真正简单的解决方案。

在虚拟环境目录中,编辑文件pyvenv.cfg。将参数include-system-site-packages = true设置为true,并保存文件。全局安装的模块将会在下次激活(source venv/bin/activate)环境时出现。

可以通过pip list进行验证。

享受吧!


1
这是我找到的唯一不需要sudo访问权限的解决方案。我的问题是,我需要在virtualenv中导入一个预先安装的全局软件包(需要sudo),并希望以可编辑模式安装其他软件包。当使用--system-site-packages创建虚拟环境时,这是不可能的。所以这对我帮助很大,谢谢! - Brenden Petersen
适合我的情况的解决方案,这是一个非常标准的情况。 - Alejandro QA

27

我最终做了什么:

cp -R /usr/lib/python2.7/dist-packages/M2Crypto /home/richard/hello-project/venv/lib/python2.7/site-packages/
cp -R /usr/lib/python2.7/dist-packages/OpenSSL /home/richard/hello-project/venv/lib/python2.7/site-packages/

5
这应该被构建到虚拟环境中。 - Sindarus
1
是的,我想知道是否有一种virualenv方法,可以在创建环境后将主机上安装的系统范围内的软件包安装到该环境中。 - Diego

13

toggleglobalsitepackages 命令可切换访问系统范围的site-packages

注意: 你需要通过 pip install virtualenvwrapper 安装 virtualenvwrapper 来获取该命令; 原版的 virtualenv 不包含此命令。使用 virtualenvwrapper 还可以获得非常有用的 mkvirtualenvrmvirtualenv 等命令。


1
只有安装了virtualenvwrapper,否则你会得到“toggleglobalsitepackages:命令未找到”的错误提示。 - szeitlin
3
截至今日,现在是toggleglobalsitepackages - eduncan911
已安装了virtualenvwrapper,但仍然出现toggleglobalsitepackages: command not found的错误。这些virtualenv的开发者真的需要更好地设计它。在我看来,这似乎是一项基本必要的功能。 - Shailen

4
venv/bin/pip install -I M2Crypto
-I 参数强制将该程序安装到虚拟环境中,即使它已经在全局范围内安装。

我会尝试一下。为什么在 pip --help 的输出中没有记录它呢? - Richard Knop
这个命令在 pip help install 中有记录。 -I 标志是针对 install 命令的,因此不会显示在全局标志列表中(还有许多其他特定于命令的标志)。 - Amber
1
谢谢。这个不太好用。你看,M2Crypto实际上可以通过pip安装,但是该库中存在一个错误,导致在Ubuntu 12.04 LTS上安装失败。他们发布了一个补丁,但对我来说没有用...所以当我尝试使用你的命令时,它会尝试从pip存储库下载库并安装它,而不仅仅是复制apt包。 - Richard Knop
1
在这种情况下,您可能希望针对此特定实例使用 --system-site-packages - Amber

0
唯一的方式将软件包从一个本地环境或全局环境转移到另一个虚拟环境是将"Lib"文件夹或包含所有内容的软件包文件夹从一个环境复制到想要软件包工作的另一个环境中。 < p >如果您不知道其位置,请使用文件浏览器在环境文件夹内搜索

Lib文件夹包含环境中安装的所有软件包。

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