【问题标题】:How to specify external system dependencies to a Python package?如何为 Python 包指定外部系统依赖项?
【发布时间】:2023-12-11 17:53:01
【问题描述】:

在编写 Python 包时,我知道如何在 setup.py 文件中指定其他所需的 Python 包,这要归功于 setuptools.setup 中的字段 install_requires

但是,我不知道如何指定不是 Python 包的外部系统依赖项,即我的包可以通过 @ 调用的命令,例如 gitcmake(示例) 987654328@或subprocess.Popen

我是否必须手动检查我的setup.py 文件中的命令的可用性,或者是否有一种奇特的方式来指定系统要求?

编辑:我只想检查外部工具是否可用,如果不可用,请邀请用户(由他们自己)安装它们。我不想在安装包时管理外部工具的安装。

贡献摘要:似乎setuptools 对此不支持,在运行时进行检查会更安全(参见 cmets 和答案)。

【问题讨论】:

  • 据我所知,setuptools 不支持此功能(并且很难通用),您必须手动指定此类依赖项;参见例如*.com/a/37481508/1968
  • 这不是 setuptools 擅长的。对于这些类型的事情,您应该将代码打包成 Linux 发行版的格式(apt/.deb、_yum_/.rpm、_pacman 等)。
  • 感谢您的回答。实际上,我只想检查系统上是否有这些命令(例如 git 或 cmake),如果没有,则打印一条消息,邀请用户安装它们。我不想完全管理外部工具的安装。
  • 我的建议是检查那些不在install-time 而是在run-time 的。在每次运行开始时,或者在第一次运行时。 -- 确实可以将它添加到setup.py,但setup.py 并不总是在安装时 执行:例如,如果您的项目被打包为wheel 那么它甚至根本不包含setup.py 文件。即使您不将项目分发为 wheel,如果我没记错的话,pip 倾向于在本地构建一个 wheel 以用于以下内容安装。 -- 所以我会说 run-time 更安全。

标签: python python-3.x setuptools setup.py python-packaging


【解决方案1】:

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

确实,您可以将其添加到您的 setup.py,但 setup.py 并不总是在安装时执行:例如,如果您的项目被打包为 wheel,那么它不会甚至根本不包含setup.py 文件。即使您不将项目作为*分发,如果我没记错的话,pip 还是倾向于在本地构建*并将其重用于后续安装。

因此,尽管可以在安装时将此类检查作为安装脚本的一部分进行(前提是您可以保证setup.py 的存在和执行),但我会说运行时是更安全的选择。

【讨论】:

    最近更新 更多