问题描述
我已经创建了文件夹并在其中初始化了virtualenv实例。
$ mkdir myproject
$ cd myproject
$ virtualenv env
当我运行(env)$ pip freeze
时,它会显示已安装的软件包。
现在我想将myproject/
重命名为project/
。
$ mv myproject/ project/
但是,现在我跑的时候
$ . env/bin/activate
(env)$ pip freeze
它说pip没有安装。如何在不破坏环境的情况下重命名项目文件夹?
最佳解决思路
您需要调整安装以使用相对路径。 virtualenv
为此提供了--relocatable
选项。来自the docs:
Normally environments are tied to a specific path. That means that you cannot move an environment around or copy it to another computer. You can fix up an environment to make it relocatable with the command:
$ virtualenv –relocatable ENV
NOTE: ENV is the name of the virtual environment and you must run this from outside the ENV directory.
This will make some of the files created by setuptools or distribute use relative paths, and will change all the scripts to use activate_this.py instead of using the location of the Python interpreter to select the environment.
Note: you must run this after you’ve installed any packages into the environment. If you make an environment relocatable, then install a new package, you must run virtualenv –relocatable again.
次佳解决思路
我相信”knowing why”比”knowing how”更重要。所以,这是解决这个问题的另一种方法。
当您运行. env/bin/activate
时,它实际执行以下命令(例如,使用/tmp
):
VIRTUAL_ENV="/tmp/myproject/env"
export VIRTUAL_ENV
但是,您刚刚将myproject
重命名为project
,因此该命令无法执行。这就是为什么说pip is not installed
,因为你没有在系统中的全球环境安装pip
和你的virtualenv pip
没有正确来源。
如果要手动修复此问题,可以采用以下方法:
-
使用您喜欢的编辑器如Vim,通常在第42行修改
/tmp/project/env/bin/activate
:VIRTUAL_ENV='/tmp/myproject/env'
=>VIRTUAL_ENV='/tmp/project/env'
-
修改第1行中的
/tmp/project/env/bin/pip
:#!/tmp/myproject/env/bin/python
=>#!/tmp/project/env/bin/python
之后,再次激活您的虚拟环境env
,您将看到您的pip
再次返回。
第三种解决思路
注意:作为@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
或者,使用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文档中记录了一种方法 – cpvirtualenv这就是你要做的。确保您不在环境中并返回shell提示符。使用所需名称键入:
cpvirtualenv oldenv newenv
然后,如有必要:
rmvirtualenv oldenv
要去你的新人:
workon newenv
第五种思路
您可以按照以下步骤解决问题:
-
重命名您的目录
-
重新运行:
$ virtualenv ..\path\renamed_directory
-
virtualenv将纠正目录关联,同时保留您的包
-
$ scripts/activate
-
$ pip freeze
验证您的包裹是否到位 -
一个重要的警告,如果你的virtualenv目录中的脚本文件中有任何静态路径依赖,你将不得不手动更改它们。
第六种思路
virtualenv-clone:另一种方法,它可以帮助我很多次没有问题。
pip install virtualenv-clone
virtualenv-clone old-dir/env new-dir/env
第七种思路
(项目文件夹内)
cd bin
sed -i 's/old_dir_name/new_dir_name/g' *
不要忘记停用并激活