我有一个包(Skype4Py),它根据操作系统不同有不同的依赖关系。这是因为它依赖于操作系统消息总线来将自己绑定到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
字典看起来像某种系统特定要求的清单,我的意思是它尽可能明确地陈述了。不过,我已经见过更糟糕的 setup.py
文件了,但如果它能正确地安装包及其依赖项(尤其不会以恶意方式破坏我的系统,但你可能会在以 .decode('base64')
结尾的字符串上发现那个 eval
…没错吧?),那么我就不太关心它有多糟糕。