如何让venv完全可移植?

2023-12-01

我想创建一个venv环境(不virtualenv)使用以下命令:

sudo apt-get install python3.8-venv
python3.8 -m venv venv_name
source venv_name/bin/activate

但它似乎包含对创建它的系统的依赖性,并且每当我想让它可移植时它就会产生问题。这意味着,我希望当我复制此文件夹和我的项目并在另一台计算机上运行它时,它无需进行任何更改即可工作。

但我无法激活环境(它被激活但解释器仍然使用系统的python and pip.

因此,我尝试制作另一个venv在第二台计算机中并复制lib and lib64较旧的文件夹venv到这个较新的venv(不替换现有文件)但这次出现以下错误:

File "/usr/local/lib/python3.8/ctypes/__init__.py" line 7, in <module>
    from _ctypes import Union, Structure, Array
ModuleNotFoundError: No module named '_ctypes'

但有趣的是,如果你注意到的话,新创建的venv在新机器中还在其本地目录中搜索丢失的包,而不是在venv.

我该如何制作venv与其所有依赖项一起移植并通过激活它可靠地部署在另一个设备中?


免责声明:这都不是我的工作,我刚刚找到这篇博文,并简要总结一下:https://aarongorka.com/blog/portable-virtualenv/ archived

警告:这只适用于(半可靠)Linux机器。不要在生产中使用!

第一步是在以下位置获取 python 可执行文件的副本venv/bin文件夹,所以一定要指定--copies创建虚拟环境时:

python3 -m venv --复制 venv

剩下的似乎就是使用您选择的工具将硬编码的绝对路径更改为相对路径。在博客文章中,他们使用pwd每当更改为 venv-parent-directory 后venv/bin/activate is run.

sed -i '43s/.*/VIRTUAL_ENV="$(cd "$(dirname "$(dirname "${BASH_SOURCE[0]}" )")" && pwd)"/' venv/bin/activate

然后,类似地,所有 pip 脚本都需要调整为使用本地 python 运行执行

sed -i '1s/./#!/usr/bin/env python/' venv/bin/pip

但是,真正的问题在安装新模块时开始。我希望大多数模块都能表现良好,但有些模块会硬编码预期的路径结构或类似地阻碍任何替换路径依赖项的工作。

但是:我发现这个技巧对于在开发人员之间共享单个文件夹以查找难以捉摸的错误非常有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让venv完全可移植? 的相关文章

随机推荐