2011-07-08 17 views
131

我已经创建了文件夹并初始化了一个virtualenv实例。重命名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移回原来的位置呢?显然,这并不能解决移动/重命名的愿望,但是这不会恢复一个工作的虚拟角色,或者它已经被无望地打破了? –

+1

是的,你是对的,它会修复虚拟env,但不能解决问题。 – Florian

回答

127

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

通常环境都绑定到一个 特定路径。这意味着你 不能移动周围的环境,或者 将其复制到另一台计算机。您可以 修复了一个环境,使之与 命令重定位:

$的virtualenv --relocatable ENV

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

这会让一些由setuptools的创建的文件 或分发 使用相对路径,并会改变 所有的脚本,以使用 activate_this.py而不是使用Python解释器的 位置 选择环境。

注意:您必须在 将任何程序包安装到 环境中后运行此操作。如果您使 环境可重新定位,然后安装 一个新软件包,则必须再次运行virtualenv --relocatable。

+1

工作就像一个魅力,谢谢。 –

+2

警告:将env更改为relocatable不仅仅是让您移动文件夹。 (请参阅*注:*从文档复制)...它可能有副作用。 –

+5

--relocatable选项目前有许多问题,并不保证在任何情况下都能正常工作。该选项可能会在未来版本的virtualenv中被弃用。另外,这不会让你的软件包跨平台。您可以移动目录,但只能在其他类似的计算机上使用。 –

79

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

当你运行:

$ . env/bin/activate

它实际上执行以下命令:

(我在/tmp测试这个)

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

但是,你刚才改名myprojectproject,以便命令执行失败。 这就是为什么它表示pip is not installed,因为您没有在系统全局环境中安装pip,或者您的virtualenv pip源代码正确。

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

  1. 修改/tmp/project/env/bin/activate与像Vim的YOUT favoriate编辑器,通常在 Line 42

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

  2. 修改/tmp/project/env/bin/pipLine 1

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

之后,激活您的虚拟环境env一遍,你会看到你pip已经回来一次。

+0

对我很好,谢谢! – Michael

+3

如果需要手动更改路径,那么应该注意,有两个以上的硬编码文件。找到所有这些:'grep -iHnR venv-name/path/to/venv-name | grep -v“^ Binary file”| grep -i venv-name'。实际上,我注意到在我的一个Django实例中,很多包都有“Python sh-bang的路径”。 – Kevin

+0

这对我有很大的帮助。我绝对需要知道为什么......谢谢! – Jarvis

28

NOTE: As @jb。指出,此解决方案仅适用于(重新)创建virtualenv s。如果环境需要几个小时来安装这个解决方案是不推荐


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 
+4

对于一些人来说,'pip install -r requirements.txt'需要几个小时(在树莓派上编译第三方C-extensions)。 –

+2

也许是真的,但这对我来说似乎是一个边缘案例。我仍然认为这可能是许多情况下可行的解决方案。 – bnjmn

+0

是的,许多项目(例如Django网站)只需30秒即可安装一切,即使它们有几十个依赖项(只要您先下载所有内容并使用'--no-index --find-links = downloadDir ') –

11

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

  1. 重命名目录
  2. 重新运行此操作:$ virtualenv ..\path\renamed_directory
  3. virtualenv将更正目录关联,同时将您的软件包保留在原位
  4. $ scripts/activate
  5. $ pip freeze,以验证您的包裹都很到位
  6. 一个重要的警告,如果您在脚本文件的任何静态路径依赖在你的virtualenv目录,你必须手动改变这些。
+0

这对我来说是一个很好的解决方案。由于这个解决方案_may_可以避免与'--relocatable'相关的一些问题,我认为这个解决方案比接受的答案要好。到目前为止,我已经注意到'_new_name_/lib/python2.7'中的许多'.pyc'文件仍然指向'_old_name_'。但是,这似乎并不影响我的环境工作方式。也许唯一更好的解决方案是使用'virtualenvwrapper'或其他在这里的答案中提到的其他实用程序。至少这个解决方案不需要安装额外的程序。 –

+0

工程就像一个魅力! – TechJS

1

virtualenv --relocatable ENV不是一个理想的解决方案。我假设大多数人都希望能够重新命名虚拟环境而不需要任何长期的副作用。

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

例如:

virtualenv-mv myproject project 

但是请注意,我只是砍死这件事。它可能会在非常情况下破坏(例如符号链接的virtualenvs),所以请小心(备份你不能丢失的东西),并让我知道你是否遇到任何问题。

23

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

pip install virtualenvwrapper 

有一个在virtualenvwrapper文件记录的方式 - cpvirtualenv 这是你做了什么。确保你已经不在你的环境中并回到shell提示符下。键入这与所需的名字:

cpvirtualenv oldenv newenv 

然后,如果必要的话:

rmvirtualenv oldenv 

要转到您的newenv:

workon newenv 
+0

非洲的答案应该是公认的方法。 – Jaxian

+0

这只适用于使用'virtualenvwrapper',而不仅仅是'virtualenv'。 [这个答案](http://stackoverflow.com/a/29482481/543738)从@ryankdwyer更好。 –

+0

我编辑了我的答案,以反映应该安装'virtualenvwrapper'。假设重命名的虚拟环境发生了很多,我会推荐这种方式。 – Afrowave

8

另一种方式做到这一点,对于工作我多次没有问题是virtualenv-clone

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

最佳答案!!! –