虚拟环境的哪些部分需要更改才能迁移?

15 投票
3 回答
9746 浏览
提问于 2025-04-16 22:14

我有一个Python程序,里面装了很多插件和包。我想把这个程序连同它的虚拟环境一起打包分发,这样用户就可以直接使用这些包了。不过,这个程序是为Windows系统做的,而在Windows上,虚拟环境的“可移动”功能是不支持的(而且这个功能还在实验阶段)。

所以,我在考虑要么写个脚本,要么手动写一些说明,来把绝对路径改成相对路径,以便移动这个虚拟环境。

我想问一下,有没有人知道在虚拟环境中我需要查找绝对路径的地方。因为我对Python打包还不是很熟悉。activate.bat这个脚本里有绝对路径,但其他的包在安装时是否也有硬编码的绝对路径呢?

这部分内容关于如何让环境可移动解释了为什么虚拟环境不能简单地移动,但没有列出包含绝对路径的地方。

相关问题:

3 个回答

3

virtualenv-tools 是一个脚本,用来在你移动了虚拟环境后更新它的位置。虽然这个工具在Windows上没什么用,但对其他系统的用户可能会有帮助。

它会更新以下内容:

  • 虚拟环境的激活脚本
  • 虚拟环境 bin/ 目录下脚本的shebang行(就是脚本开头的那一行,告诉系统用什么程序来运行这个脚本)
  • .pyc文件中存储的绝对路径
  • 任何 local/ 目录中的符号链接
6

对于你的虚拟环境目录 {ENV},请按照以下步骤操作:

  1. 运行 $ virtualenv --relocatable {ENV} 这个命令。
  2. 用 vim 或你喜欢的编辑器打开并编辑 {ENV}/bin/activate 文件。
  3. 找到大约第 42 行的 VIRTUAL_ENV,把它修改成新的目录位置。

所以,如果你想写一个脚本,你可以选择导出 VIRTUAL_ENV 这个环境变量,或者动态地编辑 /bin/activate 文件。

这就是我设置我的虚拟环境的方法。

# env/bin/activate
BIN_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# virtual env is at ./env
ENV_DIR=`dirname $BIN_DIR`
VIRTUAL_ENV=$ENV_DIR
export VIRTUAL_ENV
15

与其手动去做这些事情,不如使用 freeze 这个选项来生成一个需求文件,这样会更方便。现在你只需要一条命令,就可以重新建立整个虚拟环境。

在旧的虚拟环境上:

pip freeze > stable-req.txt

在新的虚拟环境上:

pip install -r stable-req.txt

撰写回答