设置Python的wheel包自动根据系统安装不同的依赖

当年,孤曾经介绍过《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也能用的,因此有潜在问题。


相关笔记