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

Posted

技术标签:

【中文标题】如何将模块从一个 virtualenv 复制到另一个【英文标题】:how to copy modules from one virtualenv to another 【发布时间】:2012-02-06 07:26:21 【问题描述】:

是否可以将 python 模块从一个 virtualenv 复制到另一个 virtualenv。如果是这样,这是如何完成的?

【问题讨论】:

【参考方案1】:

我在 Windows 10 上的另一个 Python venv 上安装“wordcloud”时遇到问题。软件包安装在另一个项目的同一台机器上。

Users/<user>/PycharmProjects/<projectname>/venv/Lib/site-packages 复制“wordcloud”和“wordcloud-1.8.1.dist-info”文件夹并粘贴到您的新项目/<projectname>/venv/Lib/site-packages

【讨论】:

【参考方案2】:

似乎我们不能只是将一个 virtualenv 复制为另一个。 即使您在激活文件中更改 $VIRTUAL_ENV,它仍然像在原始虚拟环境中一样,并且 pip 会将所有软件包安装到原始站点包/

【讨论】:

【参考方案3】:

我正在使用 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"

显示三个文件 activateactivate.cshactivate.fish

中的 3 个条目

在激活中,改变

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 的克隆副本)。

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

【讨论】:

【参考方案4】:

只要您将它们从一个虚拟环境移动到 同一台 机器上的另一个虚拟环境,您就可以轻松做到:

$ 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

【讨论】:

如果我只是尝试像这样复制 一个 包会不会出问题? 问题不在于复制的包的数量,而在于源和目标之间的Python版本、系统架构等方面的差异。如果源和目标在同一台机器上,你应该没问题;如果它们在不同的机器上,你应该使用pip freeze【参考方案5】:

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

【讨论】:

以上是关于如何将模块从一个 virtualenv 复制到另一个的主要内容,如果未能解决你的问题,请参考以下文章

如何将弹性搜索索引或日志从一个弹性搜索服务器复制到另一台?

如何在同一个表中将数据从一列复制到另一列?

MFC中,如何将CBitmap中的图片复制到另一CBitmap的一块区域中,即如何读取一个CBit

如何以角度将数据从一条路线传输到另一条路线? [复制]

如何将一张图像的一部分复制到另一张图像?

如何将 Python/Anaconda 虚拟环境从一台计算机复制到另一台计算机?