setup.py 安装 os 依赖

setup.py install os dependency

我想制作一个可分发的包。 我的包裹依赖于一些 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', 'install', '-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上执行的,这不是我想要实现的。

我认为您混淆了内置发行版(轮子)和源发行版的行为。

如果您的目标是在 安装 时 运行 一些子进程,那么您不能使用构建的发行版来做到这一点。构建的发行版在安装时不执行 Python 代码。它仅在 build 时执行 setup.py,这就是为什么您在调用 python setup.py bdist_wheel.

时看到函数被执行的原因

另一方面,源代码分发 (python setup.py sdist) 会在构建时和安装时执行 setup.py 文件(大致相同作为 python setup.py install) 并且会给你你正在寻找的行为。

但是,正如评论已经提到的,这将非常脆弱,而且 user-friendly 或便携性不佳。你所描述的实际上是一个 distro/OS 包,其中包含一些 Python 模块,你可能会更好。