Компиляция и установка исполняемого файла C с помощью python setuptools/setup.py?

у меня есть модуль python, который вызывает внешний двоичный файл, построенный из источника C.

источник для этого внешнего исполняемого файла является частью моего модуля python, распространяемого как a .смола.файл gz.

есть ли способ распаковки, а затем компиляции этого внешнего исполняемого файла и его установки с помощью setuptools/setup.py?

чего я хотел бы достичь, так это:

  • установка этого двоичного файла в виртуальные среды
  • управление компиляция / установка двоичного файла с помощью setup.py install, setup.py build etc.
  • создание двоичной части моего модуля python, так что он может быть распространен как колесо без внешних зависимостей

1 ответов


решено в конце концов, изменив setup.py добавить дополнительные обработчики для команд, которые делали установку.

пример setup.py что это может быть:

import os
from setuptools import setup
from setuptools.command.install import install
import subprocess

def get_virtualenv_path():
    """Used to work out path to install compiled binaries to."""
    if hasattr(sys, 'real_prefix'):
        return sys.prefix

    if hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix:
        return sys.prefix

    if 'conda' in sys.prefix:
        return sys.prefix

    return None


def compile_and_install_software():
    """Used the subprocess module to compile/install the C software."""
    src_path = './some_c_package/'

    # compile the software
    cmd = "./configure CFLAGS='-03 -w -fPIC'"
    venv = get_virtualenv_path()
    if venv:
        cmd += ' --prefix=' + os.path.abspath(venv)
    subprocess.check_call(cmd, cwd=src_path, shell=True)

    # install the software (into the virtualenv bin dir if present)
    subprocess.check_call('make install', cwd=src_path, shell=True)


class CustomInstall(install):
    """Custom handler for the 'install' command."""
    def run(self):
        compile_and_install_software()
        super().run()


setup(name='foo',
      # ...other settings skipped...
      cmdclass={'install': CustomInstall})

теперь, когда python setup.py install - Это называется, обычай CustomInstall класс используется, затем компилируется и устанавливается программное обеспечение перед запуском обычных шагов установки.

вы также можете сделать подобное для любых других шагов, которые вас интересуют (например, build/develop/bdist_egg и т. д.).

An альтернативой является сделать compile_and_install_software() функция подкласса setuptools.Command и создайте для него полноценную команду setuptools.

это сложнее, но позволяет вам делать такие вещи, как указать его как подкоманду другой команды (например, чтобы избежать ее выполнения дважды) и передать ей пользовательские параметры в командной строке.