重命名一个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
它实际上执行以下命令:
(我在/tmp
testing这个)
VIRTUAL_ENV="/tmp/myproject/env" export VIRTUAL_ENV
但是,您已将myproject
重命名为project
,以便命令执行失败。 这就是为什么它说pip is not installed
,因为您没有在系统全局环境中安装pip
,也没有正确地获取您的virtualenv pip
。
如果你想手动解决这个问题,那就是:
-
修改
/tmp/project/env/bin/activate
喜欢的编辑器如Vim,通常在Line 42
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
之后,再次激活你的虚拟环境,你会看到你的pip
再次回来。
注意:由于@jb。 指出,这个解决scheme只适用于(重新)创build的virtualenv
。 如果环境需要几个小时才能安装此解决scheme不build议
Virtualenvs是伟大的,因为它们很容易制作和转换; 他们阻止你被locking在一个单一的configuration。 如果你知道项目要求,或者可以得到它们,那么做一个新的virtualenv
:
-
创build一个
requirements.txt
文件(env)$ pip freeze > requirements.txt
- 如果您不能创build
requirements.txt
文件,请在删除原始env
之前检查env/lib/pythonX.X/site-packages
。
- 如果您不能创build
-
删除现有的
(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
您可以通过执行以下步骤来解决您的问题:
- 重命名你的目录
- 重新运行这个:
$ virtualenv ..\path\renamed_directory
- virtualenv将更正目录关联,同时保留你的软件包
-
$ scripts/activate
-
$ pip freeze
来validation你的软件包是否到位 - 一个重要的警告,如果你在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)所以请小心(备份你不能失去的东西),让我知道如果你遇到任何问题。
- 如何根据本地目录中的requirements.txt来安装软件包?
- virtualenv:指定哪些软件包使用系统范围vs本地
- ggplot中的控制点边界厚度
- 如何在Ubuntu上通过pip安装python3版本的软件包?
- 如何打包Python应用程序使其可以安装?
- 由于egg_info错误,无法通过pip安装
- 错误:无法创build'/usr/local/lib/python2.7/dist-packages/virtualenv_support':权限被拒绝
- 如何使用Google App Enginepipe理第三方Python库? (virtualenv?pip?)
- 为什么ELF执行入口点forms为0x80xxxxx的虚拟地址而不是零0x0?