如何将模块从一个virtualenv复制到另一个

时间:2012-01-09 19:17:33

标签: python django virtualenv pip

是否可以将python模块从一个virtualenv复制到另一个。如果这样做是怎么做的?

4 个答案:

答案 0 :(得分:39)

只要你在相同的机器上将它们从一个virtualenv移动到另一个virtualenv,你就可以轻松地做到:

$ cp -r [env1]/lib/pythonX.X/site-packages/* [env2]/lib/pythonX.X/site-packages/

但是,如果环境在不同的机器上或使用不同版本的python或其他一些主要差异,那么它可能不是一个好主意。通常,生成requirements.txt然后使用它来加载其他环境中的所有相同模块会更安全。您可以根据需要手动创建文件,但使用pip更容易。

$ pip freeze -E [env1] > requirements.txt

或者,如果您的virtualenv已经激活,您可以执行以下操作:

$ pip freeze > requirements.txt

然后,在您的其他环境中,您可以:

$ pip install -E [env2] -r /path/to/requirements.txt

答案 1 :(得分:2)

我正在使用Ubuntu-14.04-64的64位机器上工作。我编译并安装了python-3.4.3到 /opt/python3.4 / 并根据这个python创建了一个vitualenv。

mkvirtualenv -p /opt/python3.4/bin/python venv1

同样轻松:

sudo apt-get install virtualenvwrapper

安装了venv并成功使用PyQt5(硬位)加上numpy,scipy,ipython等。 我安装了virtualenv-clone:

workon myvenv
pip install virtual-clone
deactivate

然后跑了:

virtualenv-clone venv1 venv2

PyQt5以这种方式工作。命令行提示符仍然将 venv1 命名为活动但在〜/ .virtualenv / venv2

cat activate* | grep "venv1"

显示三个文件中的3个条目激活 activate.csh activate.fish

在激活中,更改

if [ "x(myvenv1) " != x ] ; then
        PS1="(myvenv1) $PS1"
else

...
        PS1="(myvenv2) $PS1"
...

activate.csh 更改

if ("venv1" != "") then
        set env_name = "venv1"
else

...
    set env_name = "venv2"
...

activate.fish 更改

if test -n "(venv1) "
        printf "%s%s%s" "(venv1) " (set_color normal) (_old_fish_prompt)
        return
end

...
    printf "%s%s%s" "(venv2) " (set_color normal) (_old_fish_prompt)
...

现在当您source ~/.virtualenv/venv2/bin/activateworkon venv2时,命令提示符将正确显示您的环境(venv1的克隆副本)。

编辑:这不回答问题“如何将模块从一个virtualenv复制到另一个”但我很确定结果在许多情况下是理想的结果,即创建基于先前创建的一个新的venv,其包括(所有)先前安装的模块。

答案 2 :(得分:1)

通常,您可以将.egg-info从virtualenv的lib / site-packages文件夹复制到其他环境的lib / site-packages。

答案 3 :(得分:1)

似乎我们不能将一个虚拟复制品复制为另一个。 即使你在激活文件中输入$ VIRTUAL_ENV,它仍然可以作为原始virtualenv和pip将所有包安装到源site-packages /