python - 在 setup.py 中声明特定于 Linux 的依赖项

标签 python setuptools easy-install egg

我有一个包 (Skype4Py),它根据操作系统具有不同的依赖关系。这是因为它依靠操作系统消息传递总线将自己绑定(bind)到 Skype。

在 Python 包(即 setup.py)中声明操作系统特定依赖项的正确方法是什么?

https://github.com/ProgVal/skype4py/commit/06aff9202e5fa8ad90a7bacc6ee1882ce10663dd#commitcomment-7377819

最佳答案

对我最初留下的评论进行了一些扩展,回复建议的内容是明智的。我认为没有明确的指南来说明应该采取什么做法,但实际上,setup.py 文件的要点之一是为运行该安装的代理获取正确的依赖项脚本,然后以正确的方式正确安装包,通常只会运行一次,直到需要重新安装时才会被遗忘。也就是说,使它更整洁是有意义的,所以这就是我要做的。

如果您的包只需要一组额外的 posix 系统依赖项,我会在 setup.py 文件顶部附近声明类似这样的内容

system_spec_requires = {
    'posix': ['dbus', 'gobjects',],
    # ... if others are needed
}

然后像这样声明任何硬性要求:

requires = [
    # just random examples
    'requests',
    'requests-oauthlib',
    # ... and more
]

然后通过将特定于系统的需求附加到需求来构建完整的需求列表

import os  # assuming you haven't already done that
requires.extend(system_spec_requires.get(os.name, []))

最后,在 setup.py 中调用 setup 的适当部分:

setup(
    ...
    requires=requires,
    ...
)

顶部的 system_spec_requires 字典使它看起来像是某种系统特定要求的 list ,我的意思是它看起来尽可能清楚。确实,我已经看到了更糟糕的 setup.py 文件,但如果它正确地完成了工作(即安装包及其依赖项)(尤其是不要以恶意方式破坏我的系统,但你可能会在某处以 .decode('base64') 结尾的字符串上发现 eval ……对吧?)我真的不在乎它看起来有多糟糕。

关于python - 在 setup.py 中声明特定于 Linux 的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25302504/

相关文章:

python - 在wxpython中添加笔记本页面

python - 我如何使用 setuptools 或 distutils 来分发脚本而不是 Python 包?

python - 为什么我的 setuptools 无法在 Python 3.9 中运行?

python - 使 Python 包与 virtualenv 兼容

python - easy_install libmysqld-dev 错误 :'NoneType' 对象没有属性 'clone'

python - 试图覆盖在 python 3.9 中识别的 Django 3.2 应用程序上的 allauth 模板

Python - 通过同时串联合并两个列表

python - 找出用于安装当前包的 Python?

python - 如何禁止 easy_install 压缩鸡蛋?

python - 使用 Python 删除多余的空行