【问题标题】:Specify setup time dependency with `--global-option` for a python package使用 `--global-option` 为 python 包指定设置时间依赖项
【发布时间】:2020-02-11 06:18:43
【问题描述】:

我正在尝试打包一个具有设置时(以及运行时)依赖项的 python 库:它 imports 模块,以便模块可以通知设置过程一些提供的 C 头文件的位置:

from distutils.extension import Extension
from pybedtools.helpers import get_includes as pybedtools_get_includes
from pysam import get_include as pysam_get_include
# [...]
extensions = [
    Extension(
        "bam25prime.libcollapsesam", ["bam25prime/libcollapsesam.pyx"],
        include_dirs=pysam_get_include()),
    Extension(
        "bam25prime.libcollapsebed", ["bam25prime/libcollapsebed.pyx"],
        include_dirs=pybedtools_get_includes(),
        language="c++"),
    ]
# [...]

但是,需要使用特定的--global-option pip 选项安装其中一个依赖项 (pybedtools)(请参阅文章末尾未提供该选项时会发生什么)。

如果我理解正确,在使用 setup.py 之前自动提供一些依赖项的当前最新方法是在 pyproject.toml 文件的 [build-system] 部分中指出它们。

我尝试了以下pyproject.toml

[build-system]
requires = [
    "pysam",
    "pybedtools @ git+https://github.com/blaiseli/pybedtools.git@fix_missing_headers --global-option='cythonize'",
]
build-backend = "setuptools.build_meta"

(顺便说一句,我花了很长时间才弄清楚如何指定build-backend,文档不容易找到。)

但是,这会在pip install 上生成以下错误:

  ERROR: Invalid requirement: "pybedtools @ git+https://github.com/blaiseli/pybedtools.git@fix_missing_headers --global-option='cythonize'"
  Hint: It looks like a path. File 'pybedtools @ git+https://github.com/blaiseli/pybedtools.git@fix_missing_headers --global-option='cythonize'' does not exist.

如何正确指定依赖项的选项

如果我只是指定包及其 URL ("pybedtools @ git+https://github.com/blaiseli/pybedtools.git@fix_missing_headers),安装会失败,如下所示:

    Exception:
                            Cython-generated file 'pybedtools/cbedtools.cpp' not found.

                            Please install Cython and run

                                python setup.py cythonize

在尝试解决上述错误时,我发现了--global-option pip 选项。 我可以手动运行pip install --global-option="cythonize" git+https://github.com/blaiseli/pybedtools.git@fix_missing_headers,并且安装工作,前提是已经安装了该软件包的依赖项,否则由于无法识别的"cythonize" 选项(即another issue...)而导致安装失败。

请注意,只有在“从源代码”安装时才需要此选项(例如,从 github 上的 fork 安装时,就像我在这里的情况一样)。

【问题讨论】:

  • 为了更好地理解这个问题,setuptools cythonize 选项是从哪里来的?
  • cythonize 选项旨在由我的包的依赖项的setup.py 脚本处理:github.com/daler/pybedtools/blob/master/setup.py
  • 对我来说它绝对看起来像一个命令而不是一个选项,所以别名可能更有效。

标签: python pip setuptools pyproject.toml


【解决方案1】:

与您的其他 question 相同,我怀疑 cythonizesetuptools 命令,而不是 全局选项

如果确实如此,那么最好在setup.cfg 中设置一个别名。如果您运行python setup.py alias install cythonize install,这应该将以下内容添加到您的setup.cfg

[aliases]
install = cythonize install

稍后运行pip install 时,pip 将遵循此别名,并且cythonize 命令将在install 命令之前执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-17
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    相关资源
    最近更新 更多