如何将模块从一个 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"
显示三个文件 activate、activate.csh 和 activate.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/activate
或workon 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 复制到另一个的主要内容,如果未能解决你的问题,请参考以下文章