setup.py install os依赖项

问题描述

我想制作一个可分发的软件包。 而且我的软件包取决于某些OS软件包

这是我要安装的内容

def install_libmagic():
    if sys.platform == 'darwin':
        subprocess.run(['brew','install','libmagic'])
    elif sys.platform == 'linux':
        subprocess.run(['apt-get','update'])
        subprocess.run(['apt-get','-y','libmagic1'])
    else:
        raise Exception(f'UnkNown system: {sys.platform},can not install libmagic')

我希望仅在smb调用时执行此代码pip install mypacakge

我不希望在运行时执行它:python setup.py bdist_wheel

我该如何实现?

我尝试过:

setup(
    ...
    install_requires=install_libmagic(),)

还尝试覆盖安装命令:

from setuptools.command.install import install

class MyInstall(install):
    def run(self):
        install_libmagic()
        install.run(self)
setup(
    ...
    cmdclass={'install': MyInstall}
)

但是该函数是在python setup.py bdist_wheel上执行的,这不是我想要实现的。

解决方法

我认为您正在混淆内置分布(轮子)和源分布的行为。

如果您的目标是在 install 时运行某些子进程,则无法使用内置发行版来执行此操作。内置发行版在安装时不执行任何Python代码。它仅在 build 时执行setup.py,这就是为什么您在调用python setup.py bdist_wheel时看到函数已执行的原因。

另一方面,源分发(python setup.py sdist执行在构建和安装时都执行setup.py文件(与{{1}大致相同) }),并会为您提供所需的行为。

但是,正如评论中已经提到的那样,这将非常脆弱,并且不是非常用户友好或便携式的。您所描述的实际上是一个包含一些Python模块的distro / OS软件包,而您可能会选择使用它更好。