在不破坏虚拟环境的情况下重命名虚拟环境文件夹
- 2025-03-04 08:24:00
- admin 原创
- 93
问题描述:
我已经创建了文件夹并在其中初始化了一个虚拟环境实例。
$ mkdir myproject
$ cd myproject
$ virtualenv env
当我运行时(env)$ pip freeze
,它会显示已安装的包。
现在我想重命名myproject/
为project/
。
$ mv myproject/ project/
但是现在当我跑步的时候
$ . env/bin/activate
(env)$ pip freeze
它说 pip 未安装。如何在不破坏环境的情况下重命名项目文件夹?
解决方案 1:
此答案使用了一个过时的标志,在 v16.7.11 (2021-07-20) 之后的 virtualenv 上不可用
您需要调整安装以使用相对路径。virtualenv
为此提供了实验--relocatable
选项。来自文档:
通常,环境与特定路径绑定。这意味着您无法移动环境或将其复制到另一台计算机。您可以使用以下命令修复环境以使其可重定位:
$ virtualenv --可重定位 ENV
注意: ENV 是虚拟环境的名称,您必须从 ENV 目录外部运行它。
这将使setuptools或distribute创建的一些文件使用相对路径,并将改变所有脚本以使用activate_this.py,而不是使用Python解释器的位置来选择环境。
注意:您必须在将任何软件包安装到环境中后运行此命令。如果您将环境设置为可重定位,然后安装新软件包,则必须再次运行 virtualenv --relocatable。
解决方案 2:
我相信“知道为什么”比“知道怎么做”更重要。所以,这是解决这个问题的另一种方法。
当您运行时. 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
在第1行修改:
#!/tmp/myproject/env/bin/python
=>#!/tmp/project/env/bin/python
此后,env
再次激活您的虚拟环境,您将看到您的pip
虚拟环境又回来了。
解决方案 3:
注意:正如@jb. 指出的那样,此解决方案仅适用于容易(重新)创建的virtualenv
s。如果环境需要几个小时才能安装,则不建议使用此解决方案
虚拟环境很棒,因为它们易于创建和切换;它们可以防止您被锁定在单一配置中。如果您知道项目要求,或者可以获得它们,请创建一个新的virtualenv
:
创建
requirements.txt
文件
(env)$ pip freeze > requirements.txt
+ 如果无法创建`requirements.txt`文件,请`env/lib/pythonX.X/site-packages`在删除原始文件之前进行检查`env`。
删除现有的
(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
解决方案 4:
我总是安装 virtualenvwrapper 来帮忙。从 shell 提示符:
pip install virtualenvwrapper
virtualenvwrapper 文档中记录了一种方法 - cpvirtualenv
你要做的就是这个。确保你已离开环境并返回到 shell 提示符。输入所需的名称:
cpvirtualenv oldenv newenv
然后,如果有必要的话:
rmvirtualenv oldenv
要进入你的新环境:
workon newenv
解决方案 5:
您可以按照以下步骤修复您的问题:
重命名目录
重新运行这个:`$ virtualenv ..path
enamed_directory`virtualenv 将纠正目录关联,同时保留你的软件包
$ scripts/activate
$ pip freeze
验证你的包裹是否到位一个重要的警告,如果您的 virtualenv 目录中的脚本文件中有任何静态路径依赖关系,则必须手动更改它们。
解决方案 6:
还有一种对我来说多次有效且没有问题的方法是virtualenv-clone:
pip install virtualenv-clone
virtualenv-clone old-dir/env new-dir/env
解决方案 7:
在你的项目文件夹中运行此命令:
cd bin
sed -i 's/old_dir_name/new_dir_name/g' *
不要忘记停用和激活。
解决方案 8:
在 Python 3.3+ 中,内置 venv
从 Python 3.3 开始,该virtualenv
包现在作为模块内置到 Python 中venv
。有一些细微的差别,其中之一是--relocatable
选项已被删除。因此,通常最好重新创建虚拟环境,而不是尝试移动它。有关如何执行此操作的更多信息,请参阅此答案。
想要移动而不是仅仅重新创建虚拟环境的目的是什么?虚拟环境旨在使用 venv 管理模块/包的依赖关系,以便它可以拥有它所依赖的给定包或模块的不同和特定版本,并允许在本地安装这些内容的位置。
因此,软件包应该提供一种从头开始重新创建 venv 的方法。通常,这是通过requirements.txt
文件(有时也是requirements-dev.txt
文件)甚至脚本来完成的,以便在软件包本身的设置/安装中重新创建 venv。
可能令人头疼的一点是,您可能需要特定版本的 Python 作为可执行文件,如果尚未存在,则很难实现自动化。但是,在重新创建现有虚拟环境时,只需在创建新虚拟环境时从现有 venv 运行 python 即可。之后,通常只需使用 pip 从requirements.txt
文件重新安装所有依赖项即可:
从 Windows 上的 Git Bash:
python -m venv mynewvenv
source myvenv/Scripts/activate
pip install -r requirements.txt
如果您有来自其他本地开发的包的多个本地依赖项,它可能会变得更加复杂,因为您可能需要更新本地绝对路径等 - 但是如果您将它们设置为正确的 Python 包,则可以从 git repo 安装,从而通过使用静态 URL 作为源来避免此问题。
解决方案 9:
virtualenv --relocatable ENV
不是一个理想的解决方案。我认为大多数人都希望能够重命名虚拟环境,并且不产生任何长期副作用。
所以我创建了一个简单的工具来实现这一点。virtualenv -mv的项目页面对此进行了更详细的概述,但本质上你可以virtualenv-mv
像使用简单的实现一样使用它mv
(没有任何选项)。
例如:
virtualenv-mv myproject project
但请注意,我只是破解了它。它可能在特殊情况下(例如符号链接的虚拟环境)崩溃,因此请小心(备份您不能丢失的内容),如果您遇到任何问题请告诉我。
解决方案 10:
对我来说,更简单的解决方案是:只需将site-packages
旧虚拟环境的文件夹复制到新虚拟环境中即可。
解决方案 11:
使用 Visual Studio Code (vscode),我只需打开项目根目录中的 ./env 文件夹,然后进行批量查找/替换即可切换到更新后的项目名称。这解决了这个问题。
确认which python
解决方案 12:
如果你使用 conda 环境,
conda create --name new_name --clone old_name
conda remove --name old_name --all # or its alias: `conda env remove --name old_name`
解决方案 13:
这些答案都对我没用。我使用的是 [REDACTED],它不允许传出连接,所以不行,我不能只重做我的虚拟环境,而且 --relocatable 在 2020 年被删除了。
@holys 的答案仅在两台机器上使用相同的 Python 版本时才有效。即便如此,在新机器上仅更改激活路径对我来说也不够。更有帮助的是了解Python 如何将目录添加到sys.path
。
最坏的情况是,sys.path
在虚拟环境工作的机器上打印,并sys.path
在肛门保留机器上附加,直到找到您的包。然后,您可以将该路径放在激活脚本底部的 PYTHONPATH 中。
扫码咨询,免费领取项目管理大礼包!