如何重命名virtualenv文件夹而不出错
我创建了一个文件夹,并在里面初始化了一个虚拟环境。
$ mkdir myproject
$ cd myproject
$ virtualenv env
当我运行 (env)$ pip freeze
时,它会显示已安装的包,这很正常。
现在我想把 myproject/
这个文件夹改名为 project/
。
$ mv myproject/ project/
但是,现在当我运行
$ . env/bin/activate
(env)$ pip freeze
时,它显示 pip 没有安装。请问我该如何在不破坏环境的情况下重命名项目文件夹呢?
12 个回答
注意:正如@jb.所提到的,这个解决方案只适用于那些可以轻松(重新)创建的virtualenv
。如果一个环境需要几个小时来安装,那就不推荐使用这个方法。
虚拟环境(virtualenv)非常好,因为它们容易创建和切换,这样你就不会被锁定在一个固定的配置里。如果你知道项目的需求,或者能找到这些需求,可以新建一个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,这样可以让事情变得简单一些,因为所有的虚拟环境都会集中存放在一个地方。
$(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
我觉得"知道为什么"比"知道怎么做"更重要。所以,这里有另一种方法来解决这个问题。
当你运行 . env/bin/activate
时,它实际上会执行以下命令(这里用 /tmp
作为例子):
VIRTUAL_ENV="/tmp/myproject/env"
export VIRTUAL_ENV
但是,你刚把 myproject
改名为 project
,所以这个命令执行失败了。这就是为什么它会显示 pip is not installed
,因为你并没有在系统的全局环境中安装 pip
,而你的虚拟环境中的 pip
也没有正确加载。
如果你想手动修复这个问题,可以按照以下步骤操作:
用你喜欢的编辑器,比如 Vim,修改
/tmp/project/env/bin/activate
,通常是在第42行:VIRTUAL_ENV='/tmp/myproject/env'
=>VIRTUAL_ENV='/tmp/project/env'
修改
/tmp/project/env/bin/pip
的第一行:#!/tmp/myproject/env/bin/python
=>#!/tmp/project/env/bin/python
完成这些后,再次激活你的虚拟环境 env
,你会发现 pip
又回来了。
你需要调整你的安装方式,使用相对路径。virtualenv
提供了一个 --relocatable
选项来实现这一点。根据文档:
通常情况下,环境是绑定在一个特定的路径上的。这意味着你不能随意移动这个环境或者把它复制到另一台电脑上。你可以通过以下命令来修复环境,使其可以移动:
$ virtualenv --relocatable ENV
注意:ENV 是虚拟环境的名称,你必须在 ENV 目录之外运行这个命令。
这样做会让一些由 setuptools 或 distribute 创建的文件使用相对路径,并且会把所有的脚本改为使用 activate_this.py,而不是依赖 Python 解释器的位置来选择环境。
注意:你必须在向环境中安装任何包之后再运行这个命令。如果你让环境可以移动后又安装了新包,你需要再次运行
virtualenv --relocatable
。