0

我正在尝试打包一个具有设置时(以及运行时)依赖项的 python 库:它import是模块,以便模块可以通知设置过程一些提供的 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++"),
    ]
# [...]

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

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

我尝试了以下方法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-optionpip 选项。我可以手动运行pip install --global-option="cythonize" git+https://github.com/blaiseli/pybedtools.git@fix_missing_headers,并且安装工作,前提是已经安装了该软件包的依赖项,否则由于无法识别的"cythonize"选项(这是另一个问题......),它们的安装会失败。

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

4

1 回答 1

0

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

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

[aliases]
install = cythonize install

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

于 2019-10-14T23:25:18.863 回答