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


162

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

$ mkdir myproject
$ cd myproject
$ virtualenv env

当我运行时(env)$ pip freeze,它将按原样显示已安装的软件包。

现在我想重命名myproject/project/

$ mv myproject/ project/

但是,当我跑步时

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

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


1
这个问题很老,已经有了答案,但是我想知道,为什么OP不能仅仅将virtualenv移回原来的位置?显然,这并不能解决移动/重命名的愿望,但是这不能恢复工作的virtualenv,还是已经绝望地打破了它?
马利克·鲁米

2
是的,您是对的,它可以修复虚拟环境,但不能解决问题。
Florian

2019年11月,Python3。对我来说最好的解决方案是在aarongorka.com/blog/portable-virtualenv中
Samir Sadek

Answers:


148

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

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

$ virtualenv-可重定位的ENV

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

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

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


2
警告:将环境更改为可重定位的功能不仅仅是让您移动文件夹。(请注意:从文档中复制)...可能会有副作用。
本·罗伯茨

7
--relocatable选项当前有很多问题,不能保证在所有情况下都能正常工作。将来的virtualenv版本可能不建议使用该选项。此外,这不会使您的软件包跨平台。您可以移动目录,但是只能在其他类似的计算机上使用。
Demz

1
@TheDemz grep -EIr '\Wold_venv_name\W' /path/to/new_venv将帮助查找使用旧venv的所有shabang,但不是对已迁移venv的完整验证。
滚刀

2
另外,您必须编辑virtualenvwrapper .project文件,其中包含依赖于virtualenv的源代码的路径,并假设您使用的是virutalenvwrapper,并且还重命名了项目目录以匹配新的virtualenv。
滚刀

我必须先禁用virtualenv,然后再运行它。
antonagestam

108

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

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

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

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

如果要手动修复此问题,请采用以下方法:

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

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

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

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

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


6
如果需要手动更改路径,则应注意存在两个以上的硬编码文件。找到所有类似的内容:grep -iHnR venv-name /path/to/venv-name | grep -v "^Binary file" | grep -i venv-name。实际上,我注意到在我的一个Django实例中,许多软件包中都包含“ Python sh-bang的路径”。
凯文

这对我很有帮助。我绝对需要知道为什么...谢谢!
贾维斯

与上述凯文(Keven)的评论相反,我发现编辑这两行对我来说解决了所有关于移动virtualenv的问题。也许有些用例我没有使用,所以不要遇到问题。
Deleet '16

刮!今天,我遇到了一个问题:ipython无法在中运行virtualenv。为了解决这个问题,我在文件中编辑了bash标头(它叫什么?)ipython,然后工作正常。
Deleet

嗯,这对我不起作用,看来我的激活脚本没有第2步中提到的Line 1。
埃文·扎米尔

40

注意:作为@jb。指出,此解决方案仅适用于容易(重新)创建virtualenv的。如果环境需要花费几个小时来安装此解决方案,则不建议


Virtualenvs很棒,因为它们易于制作和切换。它们可以防止您陷入单一配置中。如果您知道项目要求或可以得到它们,请新建一个virtualenv

  • 建立requirements.txt档案

    (env)$ pip freeze > requirements.txt

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

    deactivate && rm -rf env

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

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


或者,使用virtualenvwrapper使事情变得简单一些,因为所有virtualenv都保存在集中位置

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

6
对于某些人来说,pip install -r requirements.txt要花几个小时(在树莓派上编译第三方C扩展名)。
jb。

4
也许是对的,但对我来说似乎是个极端情况。我仍然认为这在许多情况下都是可行的解决方案。
bnjmn 2013年

是的,许多项目(例如Django网站)仅需30秒即可安装所有内容,即使它们具有数十个依赖项(前提是您首先下载所有内容并使用'--no-index --find-links = downloadDir' )
乔纳森·哈特利

1
@bnjmn单行代码virtualenv env && pip install -r requirements.txt不会在新环境中安装要求,因为您没有激活它
Yarin 2014年

1
@Yarin感谢您指出这一点。我完全想念它,因为virtualenv-wrapper我是用户(创建后会自动激活)。我已经更新了答案,以包括激活以virtualenv避免混淆的希望。
bnjmn 2014年

28

我总是安装virtualenvwrapper来提供帮助。在shell提示下:

pip install virtualenvwrapper

在virtualenvwrapper文档中有记录的方法-cpvirtualenv, 这就是您要做的。确保您不在环境中,然后返回到Shell提示符。输入所需名称:

cpvirtualenv oldenv newenv

然后,如有必要:

rmvirtualenv oldenv

要转到您的newenv,请执行以下操作:

workon newenv

1
Afrowave的答案确实应该是公认的方法。
贾县

这仅在使用时有效virtualenvwrapper,而不仅仅是virtualenv。来自@ryankdwyer的答案更好。
LS

我修改了答案,以反映应该安装“ virtualenvwrapper”。假设重命名虚拟环境经常发生,我建议采用这种方式。
Afrowave

即使它依赖virtualenvwrapper,它也是最简单的一种。而且效果很好。
blasrodri

17

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

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

1
对我来说,这是一个非常好的解决方案。由于该解决方案避免一些与相关的问题--relocatable,我觉得这个解决方案比接受的答案更好。到目前为止,我注意到许多.pyc文件中_new_name_/lib/python2.7仍引用_old_name_。但是,这似乎并不影响我的环境如何工作。也许唯一更好的解决方案是使用virtualenvwrapper或答案中提到的其他实用程序。至少此解决方案不需要安装其他程序。
LS

奇迹般有效!
AmirHossein

13

对我来说很多次都没有问题的实现方法是virtualenv-clone

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

这应该被标记为最佳答案。把手放下!克隆花了一些时间,耐心的家伙也是如此。
阿米特拉吉·玻色

virtualenv-clone忽略了更新提示。必须手动去做。除此之外,这很棒。
user3667349

5

(在项目文件夹中)

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

不要忘记停用和激活


效果很好; 或对于Linux路径:sed -i "s|$old_dir|$new_dir|g" bin/*
Destroyica '18

sed -i '.original' 's/old_dir_name/new_dir_name/g' *对于macs
Alex

1

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

因此,我创建了一个简单的工具来执行此操作。virtualenv-mv的项目页面对它进行了更详细的概述,但是从本质上讲,您可以virtualenv-mv像使用简单的实现mv(没有任何选项)那样使用。

例如:

virtualenv-mv myproject project

但是请注意,我只是对此进行了修改。在异常情况下(例如,符号链接的virtualenvs)它可能会损坏,因此请小心(备份无法承受的损失),如果遇到任何问题,请告诉我。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.