如何复制virtualenv

Posted

技术标签:

【中文标题】如何复制virtualenv【英文标题】:How to duplicate virtualenv 【发布时间】:2011-11-18 07:34:41 【问题描述】:

我有一个现有的 virtualenv,其中包含很多包,但 Django 是旧版本。

我想要做的是复制这个环境,所以我有另一个环境与完全相同的包更新版本的Django。我该怎么做?

【问题讨论】:

我会将你所有的需求冻结到一个 'requirements.txt' 文件中并创建另一个 virtualenv 并运行 pip install requirements.txt 如果您要复制的虚拟环境的python版本与您的默认python环境不同,您可以将新环境设置为virtualenv -p /path/to/older/venv/bin/python new_venv,然后使用您之后生成的requirements.txt pip freeze @CalvinCheng 它是“pip install -r requirements.txt” 【参考方案1】:

这是我克隆 python 虚拟环境的命令。

packs=`source-path/bin/pip freeze` && python3 -m venv <env-name> && target-path/bin/pip install $packs

上述命令中使用的约定:

source-path = 要克隆的环境路径,例如/home/john/envs/oldenv。 env-name = 克隆环境的名称,例如myenv,它也可以是一条路径,例如 /home/john/envs/myenv target-path = 新克隆环境的路径,例如/home/john/envs/&lt;env-name&gt;

使用这个的优点或者我为什么喜欢这个

    无需生成 requirements.txt 文件。 在克隆过程中未激活/停用任何环境。 要执行的单个命令(一次运行 3 个命令)。

在某些情况下,您可能希望在克隆环境时排除全局包,您可以将source-path/bin/pip freeze 替换为source-path/bin/pip freeze --local,更多关于--local here

【讨论】:

【参考方案2】:

如果您使用 pip "venv"。我复制粘贴了保存虚拟环境的文件夹,并手动更改了复制文件夹的 bin 文件夹中的文件。 我不知道它是否有效,但它有效!

【讨论】:

您好 Saai Sudarsanan D,欢迎来到 ***!请阅读how to write a good answer【参考方案3】:

最简单的选择是使用virtualenv-clone 包。

要将venv1 复制到venv2,请按以下步骤操作:

    venv1 或虚拟虚拟环境venv_dummy 中安装virtualenv-clone。创建venv_dummy

    python -m virtualenv venv_dummy
    source venv_dummy/bin/activate
    

    要安装virtualenv-clone

    (venv_dummy): pip install virtualenv-clone
    

    venv1 复制到venv2

    (venv_dummy): virtualenv-clone venv1/ venv2/
    

【讨论】:

bash 中的提示没有改变,必须编辑 bin/activate,而不是 100% 清楚如何 @MrR .. 如果您遵循此答案,则无需编辑 bin/activate。为什么一定要编辑bin/activate 克隆后,由于bin/activate 中的 PS1 部分,我在 bash 中的提示具有原始环境名称 @MrR 这听起来像是 virtualenv-clone 中的错误或疏忽,但不应该真正影响行为。 如果没有根据@MrR改名,则进入新环境bin/activate文件,搜索旧的env名称并设置新的名称。瞧!将有 2 次重命名。祝你好运!!【参考方案4】:

如果您使用的是Anaconda,您可以运行:

conda create --name myclone --clone myenv

这会将myenv 复制到新创建的名为myclone 的环境中。

【讨论】:

【参考方案5】:

virtualenvwrapper 提供command to duplicate virtualenv

cpvirtualenv ENVNAME [TARGETENVNAME]

【讨论】:

不是一个好主意。 “复制虚拟环境不太支持。每个virtualenv都有硬编码的路径信息,可能存在复制代码不知道需要更新特定文件的情况。谨慎使用。” 你能指定 venv 的路径而不是名称吗?【参考方案6】:

最简单的方法是使用 pip 生成需求文件。需求文件基本上是一个文件,其中包含您要安装的所有 python 包的列表(或者在 pip 生成的文件的情况下已经安装),以及它们的版本。

要生成需求文件,请进入您原来的 virtualenv,然后运行:

pip freeze > requirements.txt

这将为您生成 requirements.txt 文件。如果您在您喜欢的文本编辑器中打开该文件,您会看到如下内容:

Django==1.3
Fabric==1.0.1
etc...

现在,将Django==x.x 的行编辑为Django==1.3(或您想在新的virtualenv 中安装的任何版本)。

最后,激活你的 new virtualenv,然后运行:

pip install -r requirements.txt

并且 pip 将自动下载并安装您的 requirements.txt 文件中列出的所有 python 模块,无论您指定的版本是什么!

【讨论】:

如果我复制文件夹然后将其粘贴到另一台机器上会怎样?它会起作用吗?假设当然 apt-get 依赖项已解决 确实没有,正如我刚刚发现的那样。 我看到很多消息Could not find a version that satisfies the requirement a_package=#.#.# 可以轻松解决吗?我删除了一行或将等式更改为不等式。 也适用于pyenv。很棒的答案。 到目前为止,这听起来对我来说是最好的方法。【参考方案7】:

另一种选择是使用virtualenv-clone 包:

用于克隆不可重定位 virtualenv 的脚本。

【讨论】:

嗨,我可以假设这允许我将整个 python 环境复制到文件中。然后我只需要在新的计算机/操作系统中加载这个文件,我就会重新安装我所有的站点包 "virtualenv-clone source/target/" 非常感谢! 确保我们在激活 virtualenv 后安装了virtualenv-clone 语法为python -m clonevirtualenv source/ target/【参考方案8】:

你能不能简单点:

将现有的虚拟 env 目录复制到新目录 更新到新的 Django?

【讨论】:

有时我会使用这种方法,但是不得不更新 bin/activate 脚本中的某些路径。 更改是对 env 名称的引用的简单查找和替换,还是比这更复杂? 就我而言,只需在 bin/activate 中更新 VIRTUAL_ENV 常量中的路径就可以了 另一方面,改变 bin/activate 是一种相当的技巧,人们一定想知道这是否会在某些时候破坏一些东西。尤其是在生产环境中使用虚拟环境时。 它确实破坏了很多东西。重新创建或克隆 virtualenv 更容易。我试图这样做(在等待代理服务器打开以便我可以重新安装所有必需的软件包并从头开始),但它不起作用!我以为我很聪明,但可惜的是,要让它运行起来需要大量的黑客攻击,老实说,还有很多更好的事情要做。

以上是关于如何复制virtualenv的主要内容,如果未能解决你的问题,请参考以下文章

Flask

环境搭建

Virtualenv教程

底层虚拟环境 virtualenv

Flask学习-Virtualenv

Django 项目搭建(ubuntu系统)