如何让venv完全便携?

问题描述 投票:0回答:2

我想使用以下命令创建一个

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
及其所有依赖项可移植,并通过激活它来可靠地部署到另一个设备中?

linux centos virtualenv python-venv
2个回答
2
投票

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

警告:这仅在 Linux 机器上有效(半可靠)。 请勿在生产中使用!

第一步是在

venv/bin
文件夹中获取 python 可执行文件的副本,因此请务必在创建虚拟环境时指定
--copies

python3 -m venv --复制 venv

剩下的似乎就是使用您选择的工具将硬编码的绝对路径更改为相对路径。在博文中,每当运行

pwd
时,他们都会在更改为 venv-parent-directory 后使用
venv/bin/activate

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

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

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


0
投票

您可以使用嵌入的python https://www.python.org/ftp/python/3.12.0/python-3.12.0-embed-amd64.zip.

下载后,通过输入“get pip”作为搜索查询从谷歌下载 pip

获取pip.py

get_pip.py
复制到该文件夹。

打开

python312._pth
并取消注释
import
语句。

复制文件夹内 python.exe 的路径并使用类似的内容

./python-3.12.0-embed-amd64/python.exe pip install -r ./requirements.txt
./python-3.12.0-embed-amd64/python.exe ./main.py

安装软件包并运行 py 文件。我使用 powershell 脚本来运行这些命令。

© www.soinside.com 2019 - 2024. All rights reserved.