Компиляция и установка исполняемого файла 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.
это сложнее, но позволяет вам делать такие вещи, как указать его как подкоманду другой команды (например, чтобы избежать ее выполнения дважды) и передать ей пользовательские параметры в командной строке.