[英]Renaming a virtualenv folder without breaking it
我已经创建了文件夹并在其中初始化了一个 virtualenv 实例。
$ mkdir myproject
$ cd myproject
$ virtualenv env
当我运行(env)$ pip freeze
时,它会按应有的方式显示已安装的软件包。
现在我想将myproject/
重命名为project/
。
$ mv myproject/ project/
但是,现在当我跑步时
$ . env/bin/activate
(env)$ pip freeze
它说 pip 未安装。 如何在不破坏环境的情况下重命名项目文件夹?
您需要调整安装以使用相对路径。 virtualenv
通过--relocatable
选项提供了这一点。 从文档:
通常,环境与特定路径相关联。 这意味着您无法移动环境或将其复制到另一台计算机。 您可以使用以下命令修复环境以使其可重定位:
$ virtualenv --relocatable ENV
注意: ENV 是虚拟环境的名称,您必须从 ENV 目录之外运行它。
这将使 setuptools 或分发创建的一些文件使用相对路径,并将所有脚本更改为使用 activate_this.py 而不是使用 Python 解释器的位置到 select 环境。
注意:您必须在将任何软件包安装到环境中后运行它。 如果使环境可重定位,然后安装新的 package,则必须再次运行 virtualenv --relocatable。
我相信“知道为什么”比“知道如何”更重要。 因此,这是解决此问题的另一种方法。
当你运行. env/bin/activate
. 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
到 go 到你的新环境:
workon newenv
您可以按照以下步骤解决您的问题:
$ virtualenv..\path\renamed_directory
$ scripts/activate
$ pip freeze
以验证您的包裹是否到位另一种对我有用且没有问题的方法是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' *
不要忘记停用和激活。
virtualenv --relocatable ENV
不是理想的解决方案。 我假设大多数人都希望能够重命名 virtualenv而不会产生任何长期的副作用。
所以我创建了一个简单的工具来做到这一点。 virtualenv-mv的项目页面更详细地概述了它,但基本上您可以使用virtualenv-mv
,就像您使用mv
的简单实现一样(没有任何选项)。
例如:
virtualenv-mv myproject project
但是请注意,我刚刚破解了这个。 它可能会在不寻常的情况下(例如符号链接的 virtualenvs)中断,所以请小心(备份你不能失去的东西),如果你遇到任何问题,请告诉我。
从 Python 3.3 开始, virtualenv
package 现在作为venv
模块内置到 Python 中。 有一些细微差别,其中之一是--relocatable
选项已被删除。 因此,通常最好重新创建一个虚拟环境,而不是尝试移动它。 有关如何执行此操作的更多信息,请参阅此答案。
想要移动而不是仅仅重建任何虚拟环境的目的是什么? 虚拟环境旨在使用 venv 管理模块/包的依赖关系,以便它可以具有给定 package 或它所依赖的模块的不同和特定版本,并允许在本地安装这些东西的位置。
因此,package 应该提供一种从头开始重新创建 venv 的方法。 通常,这是通过requirements.txt
文件完成的,有时还需要一个requirements-dev.txt
文件,甚至是在 package 本身的设置/安装中重新创建 venv 的脚本。
可能令人头疼的一个部分是,您可能需要一个特定版本的 Python 作为可执行文件,如果还没有的话,它很难自动化。 但是,在重新创建现有虚拟环境时,可以在创建新环境时简单地从现有 venv 运行 python。 之后,通常只需使用 pip 重新安装requirements.txt
文件中的所有依赖项即可:
从 Git Bash 到 Windows:
python -m venv mynewvenv
source myvenv/Scripts/activate
pip install -r requirements.txt
如果您有来自其他本地开发的软件包的多个本地依赖项,它可能会涉及更多,因为您可能需要更新本地绝对路径等 - 尽管如果您将它们设置为正确的 Python 软件包,您可以从 git 存储库安装,因此通过将 static URL 作为源来避免此问题。
对我有用的更简单的解决方案:只需将旧虚拟环境的site-packages
文件夹复制到新环境中即可。
使用 Visual Studio Code (vscode),我刚刚在我的项目根目录中打开了 ./env 文件夹,并进行了批量查找/替换以切换到我更新的项目名称。 这解决了这个问题。
确认与which python
如果您使用的是 conda env,
conda create --name new_name --clone old_name
conda remove --name old_name --all # or its alias: `conda env remove --name old_name`
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.