重命名一个virtualenv文件夹而不打破它

我已经创build了文件夹并初始化了一个virtualenv实例。

$ mkdir myproject $ cd myproject $ virtualenv env 

当我运行(env)$ pip freeze ,它会显示已安装的软件包。

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

 $ mv myproject/ project/ 

但是,现在当我跑步

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

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

您需要调整您的安装以使用相对path。 virtualenv为此提供了--relocatable选项。 从文档 :

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

$ virtualenv –relocatable ENV

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

这将使一些由setuptools创build的文件或者使用相对path来分发,并且将改变所有的脚本来使用activate_this.py,而不是使用Python解释器的位置来select环境。

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

我相信"knowing why" matters more than "knowing how" 。 所以,这是解决这个问题的另一种方法。

当你运行:

$ . env/bin/activate

它实际上执行以下命令:

(我在/tmptesting这个)

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

但是,您已将myproject重命名为project ,以便命令执行失败。 这就是为什么它说pip is not installed ,因为您没有在系统全局环境中安装pip ,也没有正确地获取您的virtualenv pip

如果你想手动解决这个问题,那就是:

  1. 修改/tmp/project/env/bin/activate喜欢的编辑器如Vim,通常在Line 42

    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

之后,再次激活你的虚拟环境,你会看到你的pip再次回来。

注意:由于@jb。 指出,这个解决scheme只适用于(重新)创build的virtualenv 。 如果环境需要几个小时才能安装此解决scheme不build议


Virtualenvs是伟大的,因为它们很容易制作和转换; 他们阻止你被locking在一个单一的configuration。 如果你知道项目要求,或者可以得到它们,那么做一个新的virtualenv

  • 创build一个requirements.txt文件

    (env)$ pip freeze > requirements.txt

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

    deactivate && rm -rf env

  • 创build一个新的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文档中logging了一个方法 – cpvirtualenv这就是你所做的。 确保你不在你的环境中,并返回到shell提示符下。 用所需的名字input:

 cpvirtualenv oldenv newenv 

然后,如有必要:

 rmvirtualenv oldenv 

去你的newenv:

 workon newenv 

您可以通过执行以下步骤来解决您的问题:

  1. 重命名你的目录
  2. 重新运行这个: $ virtualenv ..\path\renamed_directory
  3. virtualenv将更正目录关联,同时保留你的软件包
  4. $ scripts/activate
  5. $ pip freeze来validation你的软件包是否到位
  6. 一个重要的警告,如果你在virtualenv目录中的脚本文件中有任何静态path依赖,你将不得不手动改变它们。

另外一种方法可以让我在没有任何问题的情况下工作很多次: virtualenv-clone :

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

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

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

例如:

 virtualenv-mv myproject project 

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