【问题标题】:Is it possible to embed a wheel inside another Python wheel是否可以将轮子嵌入另一个 Python 轮子中
【发布时间】:2022-06-14 14:34:48
【问题描述】:

我想发布一个依赖于OpenBabel 的 PyPI 包。 OpenBabel 的维护者为 Python 3.7 上传了二进制 Windows 轮子,但没有为更高版本的 Python 上传。 Christoph Gohlke 的 excellent site 包含适用于 3.8 及更高版本的轮子,但它们不在 PyPI 上。

我希望我的软件包的用户只需 pip install my-package 并安装 openbabel。如果他们在 Windows 上使用 Python 3.7,openbabel 将从 PyPI 加载。如果他们使用更新版本的 Python,安装我的包会失败,因为没有轮子,而且在 Windows 上从源代码安装 openbabel 真的很痛苦。

我想将 Christoph Gohlke 网站上的预编译轮子包含在我的轮子中,然后安装它们。有什么合理的方法吗?

【问题讨论】:

    标签: python windows python-wheel


    【解决方案1】:

    TL;DR: 使用local path dependencies 而不是正常的依赖关系。

    在这种情况下,您需要将 OpenBabel 的源代码嵌入到您自己的代码中(例如,作为子模块)。

    然后,您需要在项目需求中将 OpenBabel 依赖项从普通依赖项更改为本地依赖项。

    将 OpenBabel 嵌入您的项目后,您无需更改 OpenBabel 部分,您可以继续开发自己的代码。

    每次打包项目时,您的轮子中都会有 OpenBabel。

    ===== 示例 =====

    例如,您的项目结构如下:

    YourProject
    ├── pyproject.toml
    ├── openbabel_copy
    │   ├── __init__.py
    │   └── ...
    └── myproject
        ├── __init__.py
        ├── a.py
        └── ...
    

    在您的pyproject.toml 中,如果您使用的是poetry,您将有这样的行:

    [tool.poetry.dependencies]
    openbabel = { path = "openbabel_copy" }
    scipy = "^1.6.3"
    protobuf = "^3.17.1"
    ...
    

    这样您就可以毫无问题地在myproject 中使用和导入openbabel。

    这叫做local path dependency

    但是,如果您使用的是其他打包工具,我不知道该怎么做...(诗歌很漂亮,很好用,除了它的依赖解析系统慢...但我仍然强烈建议: )

    【讨论】:

    • 我不想使用openbabel的源码(编译它们需要安装许多其他依赖项),我想使用pypi上not的openbabel轮文件。跨度>
    • @zmbq 不幸的是,我认为这是不可能的。您可以将wheel 视为仅支持特定平台的已编译二进制文件。由于它是编译的,它不会支持其他平台。同样,一个轮子只能支持自己定义的特定python版本。有关 python 轮的更多信息,请参阅:peps.python.org/pep-0427/#file-name-convention
    • 这不是问题。 64 位 Windows 的 Python 3.8 轮将包含 OpenBabel 的 64 位 Windows 的 3.8 轮。
    • @zmbq 就像你说的,If they use a newer version of Python, installing my package will fail, because there's no wheel
    【解决方案2】:

    我的解决方案不是一个优雅的解决方案 - 我创建了一个新的 github 公共存储库,并将 Christoph Gohlke 网站上的轮子作为发布工件放置在该存储库中。然后我为这些轮子添加了一个 https:// 依赖项,而不仅仅是 openbabel 包。

    【讨论】:

      猜你喜欢
      • 2016-06-08
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 2016-09-11
      • 2020-04-27
      • 2015-10-12
      • 2018-05-26
      • 2017-08-19
      相关资源
      最近更新 更多