我正在尝试打包一个具有设置时(以及运行时)依赖项的 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-option
pip 选项安装(请参阅文章末尾未提供该选项时会发生什么)。
如果我理解正确,那么当前使用之前自动提供一些依赖项的最新方法是在文件的部分中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-option
pip 选项。我可以手动运行pip install --global-option="cythonize" git+https://github.com/blaiseli/pybedtools.git@fix_missing_headers
,并且安装工作,前提是已经安装了该软件包的依赖项,否则由于无法识别的"cythonize"
选项(这是另一个问题......),它们的安装会失败。
请注意,仅在“从源代码”安装时才需要此选项(例如,从 github 上的 fork 安装时,就像我在这里的情况一样)。