【问题标题】:How to create dummy RPM which pretends to provide Python modules?如何创建假装提供 Python 模块的虚拟 RPM?
【发布时间】:2023-04-02 01:43:01
【问题描述】:

我需要创建一个虚拟 RPM,它似乎在站点包中安装了一些 Python 模块,以解决 RPM 依赖问题。

真正的模块将使用 PIP 在 Python 虚拟环境中安装,但为了使系统工作,需要在全局站点包中提供导入的模块,因此需要伪造。

导入如下(示例):from pear.apple.peach import Fruit

在包含这些导入的包上执行 RPM 构建时,依赖生成失败,所以我需要本地仓库中的 RPM 来假装提供这些,以便依赖生成通过。

【问题讨论】:

    标签: python rpm packaging rpm-spec python-packaging


    【解决方案1】:

    您在问题中提出的方法对我来说没有多大意义,您可以使用其他系统 rpm 包(您计划创建或安装的包)所需的 python 模块创建 rpm 包,或者您只是使用虚拟环境然后你不需要太关心系统站点包中的内容,只要你安装了特定版本的 python 本身。虽然您可以使系统站点包在特定虚拟环境中可见(例如,当您在依赖项中有 lxml 模块时,您可以从 rpm 包安装它,然后创建一个虚拟环境以访问系统站点包,这样您就不会需要在 virtualenv 中再次安装它),在虚拟 rpm 包中提供的特定模块会破坏它,所以这也没有意义。

    换句话说,在虚拟环境中安装一些东西,然后期望通过 rpm 包安装的系统 python 模块依赖于来自该虚拟环境的东西是行不通的(恕我直言)。

    所以我建议做以下之一:

    • 构建您需要安装的模块的 rpm 包,以使其他包正常工作。只要您对 rpmbuild 有一定的经验,它应该不会那么难,您可以使用pyp2rpm 工具来创建您需要稍微调整的初始规范文件。但这也取决于您需要构建多少个包,以及您计划多久更新一次(因为这意味着更新规范文件并重新构建)。
    • 仅使用虚拟环境,无论是否可以访问系统站点包。这样,您将依赖项和应用程序都安装到虚拟环境中,您根本不需要处理 rpm 包(只要您从 rpm 包安装 python 和 virtualenv)。

    在您的情况下哪种方式更有意义在很大程度上取决于您要做什么(您打算如何维护 python 模块,您打算安装多少台机器,如果您打算自己安装它或提供给其他人自己安装等等...)。

    【讨论】:

    • 我正在一个构建系统中工作,该系统会自动为所有 Python 文件生成依赖项,如果依赖项不能与项目中其他源包中的 RPM 或 (2 ) 来自本地预建的 RPM 缓存。我的问题所基于的约束不是通常的约束,但它是我面临的约束。
    【解决方案2】:

    我能够通过使用空文件复制每个导入并在每个文件夹级别使用空 __init__.py 文件来解决此问题。

    例如,要解析from pear.apple.peach import Fruit,我需要在站点包中安装以下文件树:

    -> pear
      -> __init__.py
      -> apple
        -> peach.py
    

    虚拟 rpm 的 spec 文件的相关行:

    ...
    source:FruitDummy.tar.gz    
    ...
    % install
    mkdir -p $RPM_BUILD_ROOT%{python_sitelib}/pear/apple/
    
    install __init__.py $RPM_BUILD_ROOT%{python_sitelib}/pear/
    install peach.py $RPM_BUILD_ROOT%{python_sitelib}/pear/apple/
    ...
    %files
    %defattr(-,root,root,-)
    %{python_sitelib}/pear/__init__.py*
    %{python_sitelib}/pear/apple/peach.py*
    ...
    

    __init__.pypeach.py 存储在用于构建 RPM 的 FruitDummy.tar.gz 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-22
      • 2016-09-29
      • 2016-11-11
      • 1970-01-01
      • 2020-07-29
      • 2015-02-11
      相关资源
      最近更新 更多