设置Python的wheel包自动根据系统安装不同的依赖
2020-03-31 23:30:16 +08 字数:614 标签: Python当年,孤曾经介绍过《setup.py里的几个require》。
有时候,一个Python包,在不同操作系统,需要使用不同的依赖包。 比如,pykerberos只支持Linux平台,而Windows平台则需要使用winkerberos。
除了在setup.py
里写if else
这种丑陋的做法以外,可以使用两种setuptools
支持的方式。
extras_require ¶
一种是利用extras_require
。
这种方法可以为一个条件配置多个包。
extras_require={
':sys_platform == "win32"': ['winkerberos'],
':"linux" in sys_platform': ['pykerberos'],
}
这里使用了sys.platform
作为平台的区分方式。
这种做法广为流传,也很有效,但更推荐使用platform.system
。
install_requires ¶
第二种是利用install_requires
。
这种方法一次只能配置一个包,但更加自然。
install_requires=[
'winkerberos; platform_system == "Windows"',
'pykerberos; platform_system == "Linux"',
],
如果这类根据平台自动安装的包,数量较多,推荐使用extras_require
形式;
如果数量不大,则可以使用install_requires
的形式。
丑陋做法及其缺陷 ¶
直接在setup.py
中,手写if else
,看似也能做到按平台安装依赖,实则有致命缺陷。
import platform
INSTALLS = []
if platform.system == 'Windows':
INSTALLS.append('winkerberos')
else:
INSTALLS.append('pykerberos')
setup(
...
install_requires=INSTALLS
)
这种做法,只在源码包的场景下有效,在wheel包、egg包场景都无效。
setup.py
是打包前使用的,对打好的wheel包,依赖都已经写进了metadata,无法再修改了。
也就是说,在Linux打的包,只能在Linux使用,但看上去却是在Windows也能用的,因此有潜在问题。