我想使用以下命令创建一个venv
环境(而不是virtualenv
):
sudo apt-get install python3.8-venv
python3.8 -m venv venv_name
source venv_name/bin/activate
但它似乎包含了对创建它的系统的依赖,每当我想使它可移植时,它就会产生问题。这意味着,我想当我复制这个文件夹沿着我的项目并在另一台机器上运行它时,它将不做任何更改就能工作。
但我无法激活环境(它被激活,但解释器仍然使用系统的python
和pip
)。
因此,我尝试在第二台计算机上创建另一个venv
,并将lib
和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
及其所有依赖项都具有可移植性,并仅通过激活它就能可靠地部署在另一台设备上?
1条答案
按热度按时间vohkndzv1#
免责声明:这一切都不是我的工作,我只是发现这个博客后,将简要总结:https://aarongorka.com/blog/portable-virtualenv/archived显示器
警告:这仅在 Linux 机器上有效(半可靠)。请勿在生产环境中使用!
第一步是在
venv/bin
文件夹中获取python-executables的副本,因此请确保在创建虚拟环境时指定--copies
:python3 -m venv --复制venv
剩下的工作似乎是使用您选择的工具将硬编码的绝对路径更改为相对路径。在blogpost中,每当运行
venv/bin/activate
时,它们都会在更改为venv-parent-directory后使用pwd
。虚拟环境="$(cd“$(目录名“$(目录名“${BASH_SOURCE[0]}”)”)“)”&&密码)"/' venv/bin/激活
然后,类似地,所有pip-scripts都需要进行调整,以使用本地python运行执行
但是,真实的的问题是在安装新模块时开始的。我希望大多数模块都能表现得很好,但也会有一些模块硬编码预期的路径结构,或者类似地阻碍任何替换路径依赖的工作。
然而:我发现这个技巧对于在开发人员之间共享一个文件夹来寻找难以捉摸的bug非常有用。