如何在setup.py中运行Makefile?

38 投票
3 回答
12962 浏览
提问于 2025-04-15 16:08

我需要使用ICU自己的构建方式来编译它。因此,我有个问题:

我该如何在setup.py中运行一个Makefile?显然,我只想在构建过程中运行它,而不是在安装的时候。

3 个回答

0

你可以用distutils来构建C语言的库(可以查看distutils.core.setup中的libraries参数),不过你可能需要重复一些已经在Makefile里的选项。所以,最简单的方法可能是扩展安装命令,像其他回答中提到的那样,然后用subprocess模块来调用make命令。

2

如果你正在创建一个Python扩展,可以使用distutils或setuptools这两个工具来帮助你。比如说:

from setuptools import Extension
# or:
# from distutils.extension import Extension
setup(...
      ext_modules = [Extension("pkg.icu",
                               ["icu-sqlite/icu.c"]),
                    ]
      )

有很多方法可以用来构建扩展,详细信息可以查看文档:http://docs.python.org/distutils/setupscript.html

44

我通常使用的方法是重写相关的命令:

from distutils.command.install import install as DistutilsInstall

class MyInstall(DistutilsInstall):
    def run(self):
        do_pre_install_stuff()
        DistutilsInstall.run(self)
        do_post_install_stuff()

...

setup(..., cmdclass={'install': MyInstall}, ...)

我花了很长时间才从 distutils 的文档和源代码中弄明白这个,所以希望这能帮你省去一些麻烦。

注意:你也可以使用这个 cmdclass 参数来添加新的命令。

撰写回答