从另一个virtualenv创建virtualenv

时间:2016-09-09 10:24:10

标签: python virtualenv

我们可以从现有的virtualenv创建virtualenv以继承已安装的库吗?

详细说明:

我首先创建一个“引用”virtualenv,并添加库(修复版本):

virtualenv ref
source ref/bin/activate
pip install -U pip==8.1.1     # <- I want to fix the version number
pip install -U wheel==0.29.0  # <- I want to fix the version number

然后:

virtualenv -p ref/bin/python myapp
source myapp/bin/activate
pip list

我明白了:

pip (1.4.1)
setuptools (0.9.8)
wsgiref (0.1.2)

如何获取已安装的库?

类似问题

我看到了一个类似的问题:Can a virtualenv inherit from another?

但是我想要一个孤立的virtualenv,它不使用引用的virtualenv,除了库安装。因此,将指定目录添加到当前活动的virtualenv的Python路径中,不是解决方案。

为什么这样做?

好吧,我们有一个集成服务器来构建应用程序(用于发布和持续集成),我们希望保持对库版本的控制并使构建更快。

创建可重定位的virtualenv

我想我可以使用relocatable virtualenv,这样:

  1. 创建参考 virtualenv
  2. 让它可重新定位:``virtualenv --relocatable ref```
  3. 对于“myapp”:

    • 参考复制到 myapp

    您如何看待这个解决方案?对于可分发版本是否可靠?

5 个答案:

答案 0 :(得分:5)

您可以using .pth files解决问题。基本上你这样做:

virtualenv -p ref/bin/python myapp
realpath ref/lib/python3.6/site-packages > myapp/lib/python3.6/site-packages/base_venv.pth

执行此操作并激活myapp后,如果您运行pip list,您应该也会看到ref中的所有软件包。请注意,myapp中安装的所有软件包都会隐藏ref中的相应软件包。

答案 1 :(得分:3)

当你安装第二个virtualenv时,你必须添加--system-site-packages标志。

virtualenv -p ref/bin/python myapp --system-site-packages

答案 2 :(得分:1)

您可以freeze来自一个环境的包裹列表:

(ref) user@host:~/dir$ pip freeze > ref-packages.txt

然后安装它们:

(use) user@host:~/dir$ pip install -r ref-packages.txt

答案 3 :(得分:0)

pip版本1.4.1与旧版virtualenv捆绑在一起。例如Ubuntu 14.04附带的那个。您应该从系统中删除它并安装最新版本的virtualenv

pip install virtualenv

这可能需要root权限(sudo)。

然后在虚拟环境pip内升级pip install -U pip或重新创建环境。

答案 4 :(得分:0)

我认为你的问题可以用不同的方式解决。使用PYTHONPATH。首先,我们创建ref virtaulenv并在此处安装所有需要的包

$ virtualenv ref
$ source ref/bin/activate
$ pip install pep8
$ pip list
> pep8 (1.7.0)
> pip (8.1.2)
> setuptools (26.1.1)
> wheel (0.29.0)

然后我们创建第二个virtaulenv use

$ virtualenv use
$ source use/bin/activate
$ pip list
> pip (8.1.2)
> setuptools (26.1.1)
> wheel (0.29.0)

现在我们可以在此环境中设置PYTHONPATH以包含ref的目录

$ export PYTHONPATH=PYTHONPATH:/home/path_to/ref/lib/python2.7/site-packages:/home/path_to/ref/local/lib/python2.7/site-packages
$ pip list
> pep8 (1.7.0)
> pip (8.1.2)
> setuptools (26.1.1)
> wheel (0.29.0)

正如您所看到的那样,您只需在ref的环境中引用已安装的软件包。另请注意,我们在末尾添加此文件夹,因此它们的优先级较低。

注意:这不是PYTHONPATH中存在的所有文件夹。我把它包括在内,因为它们是主要的。但是,如果您遇到一些问题,也可以添加其他问题,只需使用此方法查找所需的路径即可 how to print contents of PYTHONPATH