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

时间:2014-08-14 07:37:33

标签: python setuptools easy-install egg

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

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

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

1 个答案:

答案 0 :(得分:2)

对我最初留下的评论进行了扩展,回复建议是明智的。我不认为有明确指导这些做法应该做什么,但实际上,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的{​​{1}}来电中的相应部分:

setup.py

顶部的setup( ... requires=requires, ... ) 字典使它看起来像某种系统特定要求的清单,我的意思是尽可能清楚地说明。实际上,我已经看到了更糟糕的system_spec_requires文件,但如果它能正确完成工作(即安装带有依赖项的软件包)(尤其不会以恶意的方式弄乱我的系统,但你可能会发现那个setup.py字符串以eval结尾......对吗?)我真的不在乎它看起来有多糟糕。