繁体   English   中英

重命名 virtualenv 文件夹而不破坏它

[英]Renaming a virtualenv folder without breaking it

我已经创建了文件夹并在其中初始化了一个 virtualenv 实例。

$ mkdir myproject
$ cd myproject
$ virtualenv env

当我运行(env)$ pip freeze时,它会按应有的方式显示已安装的软件包。

现在我想将myproject/重命名为project/

$ mv myproject/ project/

但是,现在当我跑步时

$ . env/bin/activate
(env)$ pip freeze

它说 pip 未安装。 如何在不破坏环境的情况下重命名项目文件夹?

您需要调整安装以使用相对路径。 virtualenv通过--relocatable选项提供了这一点。 文档

通常,环境与特定路径相关联。 这意味着您无法移动环境或将其复制到另一台计算机。 您可以使用以下命令修复环境以使其可重定位:

$ virtualenv --relocatable ENV

注意: ENV 是虚拟环境的名称,您必须从 ENV 目录之外运行它。

这将使 setuptools 或分发创建的一些文件使用相对路径,并将所有脚本更改为使用 activate_this.py 而不是使用 Python 解释器的位置到 select 环境。

注意:您必须在将任何软件包安装到环境中后运行它。 如果使环境可重定位,然后安装新的 package,则必须再次运行 virtualenv --relocatable。

我相信“知道为什么”比“知道如何”更重要 因此,这是解决此问题的另一种方法。

当你运行. env/bin/activate . env/bin/activate ,它实际上执行以下命令(例如使用/tmp ):

VIRTUAL_ENV="/tmp/myproject/env"
export VIRTUAL_ENV

但是,您刚刚将myproject重命名为project ,因此该命令无法执行。 这就是为什么它说pip is not installed的原因,因为您尚未在系统全局环境中安装pip并且您的 virtualenv pip来源不正确。

如果你想手动解决这个问题,方法是:

  1. 使用您喜欢的编辑器(例如 Vim),通常在第 42 行修改/tmp/project/env/bin/activate

    VIRTUAL_ENV='/tmp/myproject/env' => VIRTUAL_ENV='/tmp/project/env'

  2. 在第 1 行修改/tmp/project/env/bin/pip

    #!/tmp/myproject/env/bin/python => #!/tmp/project/env/bin/python

之后,再次激活您的虚拟环境env ,您将看到您的pip又回来了。

注意:作为@jb。 指出,此解决方案仅适用于轻松(重新)创建的virtualenv 如果环境需要几个小时才能安装此解决方案,不建议使用


Virtualenvs 很棒,因为它们很容易制作和切换; 它们使您不会被锁定在单一配置中。 如果您知道项目要求,或者可以得到它们,请创建一个新的virtualenv

  • 创建requirements.txt文件

    (env)$ pip freeze > requirements.txt

    • 如果您无法创建requirements.txt文件,请在删除原始env之前检查env/lib/pythonX.X/site-packages
  • 删除现有的(env)

    deactivate && rm -rf env

  • 创建一个新的virtualenv ,激活它,并安装要求

    virtualenv env &&. env/bin/activate && pip install -r requirements.txt


或者,使用 virtualenvwrapper 使事情变得更容易,因为所有 virtualenvs 都保存在一个集中的位置

$(old-venv) pip freeze > temp-reqs.txt
$(old-venv) deactivate
$ mkvirtualenv new-venv
$(new-venv) pip install -r temp-reqs.txt
$(new-venv) rmvirtualenv old-venv

我总是安装 virtualenvwrapper 来帮忙。 从 shell 提示:

pip install virtualenvwrapper

virtualenvwrapper 文档中记录了一种方法 - cpvirtualenv这就是你要做的。 确保您离开您的环境并返回 shell 提示符。 输入所需的名称:

cpvirtualenv oldenv newenv

然后,如有必要:

rmvirtualenv oldenv

到 go 到你的新环境:

workon newenv

您可以按照以下步骤解决您的问题:

  1. 重命名你的目录
  2. 重新运行: $ virtualenv..\path\renamed_directory
  3. virtualenv 将更正目录关联,同时保留你的包
  4. $ scripts/activate
  5. $ pip freeze以验证您的包裹是否到位
  6. 一个重要的警告,如果您的 virtualenv 目录中的脚本文件中有任何 static 路径依赖项,则必须手动更改它们。

另一种对我有用且没有问题的方法是virtualenv-clone

pip install virtualenv-clone
virtualenv-clone old-dir/env new-dir/env

在您的项目文件夹中运行它:

cd bin
sed -i 's/old_dir_name/new_dir_name/g' *

不要忘记停用和激活。

virtualenv --relocatable ENV不是理想的解决方案。 我假设大多数人都希望能够重命名 virtualenv而不会产生任何长期的副作用。

所以我创建了一个简单的工具来做到这一点。 virtualenv-mv的项目页面更详细地概述了它,但基本上您可以使用virtualenv-mv ,就像您使用mv的简单实现一样(没有任何选项)。

例如:

virtualenv-mv myproject project

但是请注意,我刚刚破解了这个。 它可能会在不寻常的情况下(例如符号链接的 virtualenvs)中断,所以请小心(备份你不能失去的东西),如果你遇到任何问题,请告诉我。

在 Python 3.3+ 中,内置 venv

从 Python 3.3 开始, virtualenv package 现在作为venv模块内置到 Python 中。 有一些细微差别,其中之一是--relocatable选项已被删除。 因此,通常最好重新创建一个虚拟环境,而不是尝试移动它。 有关如何执行此操作的更多信息,请参阅此答案

想要移动而不是仅仅重建任何虚拟环境的目的是什么? 虚拟环境旨在使用 venv 管理模块/包的依赖关系,以便它可以具有给定 package 或它所依赖的模块的不同和特定版本,并允许在本地安装这些东西的位置。

因此,package 应该提供一种从头开始重新创建 venv 的方法。 通常,这是通过requirements.txt文件完成的,有时还需要一个requirements-dev.txt文件,甚至是在 package 本身的设置/安装中重新创建 venv 的脚本。

可能令人头疼的一个部分是,您可能需要一个特定版本的 Python 作为可执行文件,如果还没有的话,它很难自动化。 但是,在重新创建现有虚拟环境时,可以在创建新环境时简单地从现有 venv 运行 python。 之后,通常只需使用 pip 重新安装requirements.txt文件中的所有依赖项即可:

从 Git Bash 到 Windows:

python -m venv mynewvenv
source myvenv/Scripts/activate
pip install -r requirements.txt

如果您有来自其他本地开发的软件包的多个本地依赖项,它可能会涉及更多,因为您可能需要更新本地绝对路径等 - 尽管如果您将它们设置为正确的 Python 软件包,您可以从 git 存储库安装,因此通过将 static URL 作为源来避免此问题。

对我有用的更简单的解决方案:只需将旧虚拟环境的site-packages文件夹复制到新环境中即可。

使用 Visual Studio Code (vscode),我刚刚在我的项目根目录中打开了 ./env 文件夹,并进行了批量查找/替换以切换到我更新的项目名称。 这解决了这个问题。

确认与which python

如果您使用的是 conda env,

conda create --name new_name --clone old_name
conda remove --name old_name --all # or its alias: `conda env remove --name old_name`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM