【问题标题】:How can I run a Makefile in setup.py?如何在 setup.py 中运行 Makefile?
【发布时间】:2010-12-17 19:38:54
【问题描述】:

我需要使用它自己的构建机制编译ICU。因此问题:

如何从setup.py 运行 Makefile?显然,我只希望它在构建过程中运行,而不是在安装时运行。

【问题讨论】:

    标签: python distutils


    【解决方案1】:

    我通常使用的方法是覆盖有问题的命令:

    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 参数来添加新命令。

    【讨论】:

    • 感谢您的回答。救了我的痛苦?有点,我已经花了太多时间寻找这个答案......
    • 在阅读了这个答案之后,我已经实现了类似的东西并且效果很好(github.com/Turbo87/py-xcsoar/blob/master/setup.py)。该代码运行一个 Makefile,该文件创建两个可执行文件和修改后的 setup.py,然后甚至将这些可执行文件安装到系统上。安装任何类型的库也是如此。
    • 请注意,这似乎不适用于 pip,但是如果您将 distutils.command.install 更改为 setuptools.command.install 则可以,取自 stackoverflow.com/questions/15853058/…
    • 非常感谢!这就是我需要的。我还编写了一个简单的 setup.py 来构建 hostapd。希望这对在这个问题上苦苦挣扎的人有用。 github.com/anakin1028/hostapd_binder/blob/master/setup.py
    【解决方案2】:

    可以使用 distutils 构建 C 库(参见 distutils.core.setup 的 libraries 参数),但您可能必须复制 Makefile 中已有的选项,因此最简单的做法可能是扩展按照其他回复中的说明安装命令,并使用子进程模块调用 make。

    【讨论】:

      【解决方案3】:

      如果你正在构建一个 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

      【讨论】:

      • 这不是我想要构建的扩展,而只是一个不会与 Python 链接的 C 库。 (它是 sqlite 的扩展。)
      猜你喜欢
      • 2015-06-21
      • 2016-01-21
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      相关资源
      最近更新 更多