我们可以从现有的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,这样:
对于“myapp”:
您如何看待这个解决方案?对于可分发版本是否可靠?
答案 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