【问题标题】:How to make venv completely portable?如何使 venv 完全可移植?
【发布时间】:2021-09-24 07:06:33
【问题描述】:

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

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

但它似乎包含对创建它的系统的依赖关系,并且每当我想使其可移植时都会产生问题。这意味着,当我将此文件夹与我的项目一起复制并在另一台机器上运行时,我希望它能够在不进行任何更改的情况下工作。

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

因此,我尝试在第二台计算机上创建另一个 venv 并将 liblib64 文件夹从较旧的 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


    【解决方案1】:

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

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

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

    python3 -m venv --copy venv

    剩下的似乎是使用您选择的工具将硬编码的绝对路径更改为相对路径。在博文中,他们在每次运行venv/bin/activate 时更改到 venv-parent-directory 后使用pwd

    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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-05
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      相关资源
      最近更新 更多