Как я могу запустить Makefile в setup.py?

Мне нужно скомпилировать ICU, используя собственный механизм сборки. Поэтому вопрос:

Как я могу запустить Makefile из setup.py? Очевидно, я хочу, чтобы он запускался только во время процесса сборки, а не во время установки.


person Georg Schölly    schedule 18.11.2009    source источник


Ответы (3)


Метод, который я обычно использую, заключается в переопределении рассматриваемой команды:

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 для добавления новых команд.

person Walter    schedule 19.11.2009
comment
Спасибо за ответ. Спасает меня от боли? Вроде как, я уже потратил слишком много времени на поиск этого ответа... - person Georg Schölly; 19.11.2009
comment
после прочтения этого ответа я реализовал что-то подобное, и оно работает достаточно хорошо (github.com/Turbo87/py-xcsoar/blob/master/setup.py). код запускает Makefile, который создает два исполняемых файла и модифицированный файл setup.py, а затем даже устанавливает эти исполняемые файлы в систему. то же самое можно было бы установить и для установки любой библиотеки. - person TBieniek; 13.11.2013
comment
Обратите внимание, что это не очень хорошо работает с pip, однако, если вы измените distutils.command.install на setuptools.command.install, это произойдет, взято из stackoverflow.com/questions/15853058/ - person wxs; 24.10.2016
comment
Большое спасибо! Это то, что мне нужно. Я также пишу простой setup.py для сборки hostapd. надеюсь, что это полезно для тех, кто борется с этой проблемой. github.com/anakin1028/hostapd_binder/blob/master/setup.py - person Anakin Tung; 24.05.2017

Если вы создаете расширение 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

person resi    schedule 18.11.2009
comment
Это не расширение, которое я хочу создать, а просто библиотека C, которая не будет связана с Python. (Это расширение для sqlite.) - person Georg Schölly; 18.11.2009

Можно собрать библиотеки C с помощью distutils (см. параметр library в distutils.core.setup), но вам, возможно, придется продублировать параметры, которые уже есть в Makefile, поэтому, вероятно, проще всего расширить команду установки как объясняется в других ответах и ​​вызовите make с модулем подпроцесса.

person Éric Araujo    schedule 28.10.2011