重命名一个 viralenv 文件夹而不破坏它

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

$ mkdir myproject
$ cd myproject
$ virtualenv env

当我运行 (env)$ pip freeze时,它会显示应该安装的包。

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

$ mv myproject/ project/

但是,现在当我跑

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

如何在不破坏环境的情况下重命名项目文件夹?

85829 次浏览

您需要调整您的安装使用相对路径。 virtualenv提供了 --relocatable选项。来自 那些文件:

通常情况下,环境与 特定的路径。这意味着你 不能移动周围的环境 复制到另一台电脑上,你可以 修理一个环境使它 使用以下命令可重定位:

$viralenv ——可重新定位的 ENV

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

这会让一些文件 由 setuptools 或 distribution 创建 使用相对路径,并将改变 所有要使用的脚本 激活 _ this. py 而不是使用 Python 解释器的位置 选择环境。

注意: 您必须在完成 将任何软件包安装到 环境 环境可重定位,然后安装 一个新的包,您必须运行 viralenv 重新定位。

我相信 “知道为什么”比“知道怎么做”更重要。因此,这里有另一种方法来解决这个问题。

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

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

但是,您刚刚将 myproject重命名为 project,因此该命令执行失败。 这就是为什么它显示为 pip is not installed,因为您还没有在系统全局环境中安装 pip,而且您的 viralenv 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又回来了。

注意: As@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


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

$(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

你可以通过以下步骤解决你的问题:

  1. 重命名目录
  2. 重播: $ virtualenv ..\path\renamed_directory
  3. Viralenv 将在保留包的同时纠正目录关联
  4. $ scripts/activate
  5. $ pip freeze验证您的包是否到位
  6. 一个重要的警告是,如果在 viralenv 目录中的脚本文件中有任何静态路径依赖项,则必须手动更改这些依赖项。

virtualenv --relocatable ENV不是一个理想的解决方案。我认为大多数人都希望能够重命名一个 viralenv 没有的任何长期副作用。

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

例如:

virtualenv-mv myproject project

不过请注意,我刚刚把它分解了。它可能在不寻常的情况下坏掉(例如 symlink viralenvs) ,所以请小心(备份您不能丢失的东西) ,如果遇到任何问题,请告诉我。

我总是安装 viralenvwrapper 来帮助解决这个问题:

pip install virtualenvwrapper

Virtual alenvwrapper 文档中记录了一种方法—— < a href = “ https://viralenvwrapper.readthedocs.org/en/update/command _ ref.html 这就是你的工作。确保您离开了环境并返回到 shell 提示符。输入所需的名称:

cpvirtualenv oldenv newenv

然后,如果有必要的话:

rmvirtualenv oldenv

去你的新女友那里:

workon newenv

然而,另一种对我来说屡试不爽的方法是 虚拟克隆:

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

在项目文件夹中运行此命令:

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

别忘了关闭并激活。

在 Python 3.3 + 中使用内置的 venv

从 Python 3.3开始,virtualenv包作为 venv模块内置在 Python 中。有一些细微的差别,其中之一是 --relocatable选项已被删除。因此,通常最好是重新创建一个虚拟环境,而不是试图移动它。看看这个答案了解更多关于如何做到这一点的信息。

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

因此,一个包应该提供一种从头开始重新创建 venv 的方法。这通常是通过一个 requirements.txt文件来完成的,有时也会使用一个 requirements-dev.txt文件,甚至是在包本身的安装/安装过程中重新创建 venv 的脚本。

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

来自 Windows 上的 Git Bash:

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

如果你从其他本地开发的软件包中获得了几个本地依赖项,那么问题可能会更复杂一些,因为你可能需要更新本地绝对路径,等等——尽管如果你把它们设置成合适的 Python 软件包,你可以从 git repo 安装,因此通过使用一个静态 URL 作为源来避免这个问题。

对我来说更简单的解决方案是: 只需将旧的虚拟环境的 site-packages文件夹复制到一个新的文件夹中。

使用 VisualStudio 代码(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`