Лучший способ упаковать библиотеку Python, которая включает в себя общую библиотеку C?

Я написал библиотеку, основная функциональность которой реализована в C (скорость критическая), с тонким слоем Python вокруг нее, чтобы справиться с ctypes .

Я приду, чтобы упаковать его, и мне интересно, как я могу это сделать. Код, с которым он должен взаимодействовать, является общей библиотекой. У меня есть Makefile, который строит код C и создает .so файл, но я не знаю, как это сделать с помощью distutils. Должен ли я просто позвонить с subprocess , переопределив команду install (если это так, install место для этого или build более подходящим?)

Обновление : хочу отметить, что это не расширение Python. То есть, библиотека C не содержит кода для взаимодействия с временем выполнения Python. Python вызывает вызовы внешних функций для прямой библиотеки C.

3 Solutions collect form web for “Лучший способ упаковать библиотеку Python, которая включает в себя общую библиотеку C?”

Учитывая, что вы следовали инструкциям о том, как создавать расширения Python в C , вы должны просто заручиться такими модулями расширения, как в этой документации .
Поэтому скрипт setup.py вашей библиотеки должен выглядеть так:

 from distutils.core import setup, Extension setup( name='your_python_library', version='1.0', ext_modules=[Extension('your_c_extension', ['your_c_extension.c'])], ) 

и distutils знает, как скомпилировать ваше расширение для общей библиотеки C и, кроме того, куда его поместить.

Конечно, у меня нет дополнительной информации о вашей библиотеке, поэтому вы, вероятно, захотите добавить дополнительные аргументы в setup(...) вызова.

Я бы подумал о создании модуля python как подпроекта обычной сборной библиотеки. Итак, используйте automake, autoconf или что-то в этом роде для создания общей библиотеки, у вас есть каталог python_bindings с setup.py и вашим модулем python.

У меня была аналогичная потребность и нашла этот ответ полезным: Python setup.py make make make не включает двоичные файлы .

У меня есть библиотека ANSI C в каталоге src моего дистрибутива. В каталоге src находится Makefile, который создает файл liblsd.so в моем каталоге пакетов ( lsd ). Я вызываю это в setup.py, а затем сообщаю setup, чтобы включить файл библиотеки, используя аргумент package_data .

 import os.path import subprocess from setuptools import setup with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as f: readme = f.read() subprocess.call(['make', '-C', 'src']) setup(name='LSD', version='0.0.1', description='Python bindings for the LSD line segment detector.', long_description=readme, author='Geoff Hing', author_email='geoffhing@gmail.com', url='https://github.com/ghing/python-lsd', packages=['lsd'], package_data={'lsd': ['liblsd.so']}, include_package_data=True, classifiers=[ 'Development Status :: 1 - Planning', 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Programming Language :: C', ], ) 
  • py2exe ImportError: нет модуля с именем <package I immedmented>
  • Python distutils - кто-нибудь знает, как его использовать?
  • Как запустить Makefile в setup.py?
  • Как я могу заставить setuptools установить пакет, который не находится в PyPI?
  • Создание модуля расширения Python с distutils
  • Как скомпилировать OpenGL с расширением C ++ python с использованием distutils на Mac OSX?
  • python distutils не включает data_files
  • Выполните установку post-скрипта Python с помощью distutils / setuptools
  • Python - лучший язык программирования в мире.