问题描述
我想制作一个可分发的软件包。 而且我的软件包取决于某些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软件包,而您可能会选择使用它更好。