如何指定 Python 包的外部系统依赖?

8
当编写Python包时,我知道如何在setup.py文件中使用setuptools.setup中的install_requires字段来指定其他所需的Python包。但是,我不知道如何指定非Python包的外部系统依赖项,即像gitcmake这样的命令(示例),我的包可以通过subprocess.callsubprocess.Popen调用?
我是否必须在setup.py文件中手动检查命令的可用性,还是有一种花哨的方法可以指定系统要求?
编辑:我只想能够检查外部工具是否可用,如果不可用,邀请用户自行安装它们。我不想在安装包时管理外部工具的安装。
贡献摘要:似乎setuptools不支持此功能,最好在运行时进行检查(参见评论和答案)。

2
据我所知,setuptools没有支持这个功能(而且要使其通用化很困难),您必须手动指定这些依赖项;例如,请参见https://dev59.com/c1wX5IYBdhLWcg3w-DfJ#37481508。 - Konrad Rudolph
https://stackoverflow.com/a/53981373/7976758 - phd
1
这不是_setuptools_ 擅长的领域。对于这些事情,你应该将你的代码打包成Linux发行版的格式(_apt/.deb, yum/.rpm, _pacman_等)。 - sinoroc
1
谢谢你的回答。实际上,我只想检查系统上是否有可用的命令(例如git或cmake),如果没有,则打印一条消息邀请用户安装它们。我不想完全管理外部工具的安装。 - Odin
2
我的建议是在运行时而不是安装时检查这些内容。可以在每次运行开始时或者第一次运行时进行检查。虽然你可以将此添加到你的 setup.py 中,但是 setup.py 并不总是在安装时执行:例如,如果你的项目被打包为一个 wheel_,那么它根本不包含 setup.py 文件。即使你没有将项目作为 wheel 分发,如果我没记错的话,_pip 也会在后续的安装中本地构建一个 _wheel_。因此,我认为在运行时更加安全。 - sinoroc
@sinoroc 好的,我理解了,感谢您提供的详细信息。我认为您可以将您的评论制作成接受的答案。 - Odin
1个回答

6

我的建议是在运行时而不是在安装时检查是否存在这些外部依赖项。可以在每次运行时开始检查,或者可能在第一次运行时。

确实,您可以将此添加到您的setup.py文件中,但并不总是在安装时执行setup.py:例如,如果您的项目被打包为一个wheel,则根本不包含setup.py文件。即使您不将您的项目作为wheel分发,如果我没记错,pip也倾向于在本地构建wheel,并重复使用它进行后续安装。

因此,虽然可以在安装脚本的一部分中在安装时执行这些检查(前提是您可以保证存在和执行setup.py),但我认为运行时是更安全的选择。


你能提供一个这样的运行时检查的例子吗? - undefined
@JJoao 不知道这些依赖是什么,以及它们如何与Python代码交互,我无法提供示例。这些外部依赖是库还是应用程序?总之,通常情况下,我猜想人们会尝试使用外部依赖,并在有错误时捕获它们。如果外部依赖是一个应用程序,可以使用subprocess.check_call()或类似的方法。 - undefined
Sinoroc,我在考虑我们可以用一种通用的正式方式来谈论外部依赖:apt install X(可能使用pipy的apt python模块)。这将涵盖很多情况。 - undefined
@JJoao,我不知道我还能说什么。请随意提出你自己独立的问题,以便你可以更详细地阐述你想要实现的目标。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接