Как создать файлы make .so из кода, написанного на C или C ++, которые можно использовать из Python - PullRequest
1 голос
/ 09 апреля 2010

Глядя на модули Python и код в каталоге "lib-dnyload" в среде Python, я заметил, что всякий раз, когда код создает какой-то графический интерфейс или графический объект, он импортирует не Python-файл с расширением .so. И в "lib-dnyload" есть тонны .so файлов.

Из поисков в Интернете я обнаружил, что эти файлы называются общими объектами и написаны на C или C ++. У меня есть Mac, и я использую GCC. Как сделать общие объектные файлы, которые доступны через Python? Главным образом, как сделать общие объекты с GCC, используя Mac OS X.

Ответы [ 5 ]

4 голосов
/ 09 апреля 2010

Официальная документация по Python начинается с простого примера. Это достаточно для начала.

2 голосов
/ 10 апреля 2010

Стандартный способ сборки и установки модулей расширения C с Python - это использование функций Distutils , включенных в стандартную библиотеку Python. Обычно это означает включение файла (ов) C в каталог вашего проекта и создание файла конфигурации, обычно называемого setup.py, для идентификации исходных файлов C. Запустив правильно настроенный файл setup.py в Python, Distutils позаботится о компиляции и компоновке исходных файлов C с помощью компилятора C вашей системы и компоновщика. (В OS X вам понадобится установить бесплатные Xcode средства разработчика Apple, которые устанавливают версии gcc.) Просмотрите всю документацию Distutils, чтобы выяснить, что делать, может быть непосильным прямо сейчас. Вот простой учебник , которого должно быть достаточно для начала работы.

Зачем использовать Distutils setup.py вместо того, чтобы просто вызывать gcc самостоятельно? Несколько причин:

  1. Поскольку расширения C обычно выполняются в контексте самого интерпретатора Python, важно, чтобы расширения были скомпилированы и связаны так, чтобы это было совместимо с кодом C в интерпретаторе. Distutils пытается отгадать догадки, предоставляя правильные опции для Python, под которым вы выполняете. Это может быть особенно важно в OS X, где Pythons выпускаются в различных вариантах, в том числе с различными комбинациями исполняемых файлов различных архитектур (например, -arch i386, -arch ppc, -arch x86_64, -arch ppc64) и поддержкой нескольких версий OS X (т.е. текущие установщики python.org OS X совместимы с OS X 10.4–10.6).

  2. Distutils позволяет упаковывать и распространять комбинации модулей расширения на чистом языке Python и C независимо от компьютера и операционной системы. Во многих случаях, если код C написан так, чтобы избежать зависимых от операционной системы системных вызовов и т. П., Ваши расширения C могут быть собраны и установлены на большинстве современных платформ Python без изменений и без необходимости знать, какой компилятор C использовать или какие опции использовать. комплект.

  3. Вы обнаружите, что почти все современные сторонние пакеты Python с кодом C работают таким образом, поэтому полезно привыкнуть к этому с самого начала Distutils.

  4. Как вы увидите в руководстве, для многих случаев очень легко настроить файл setup.py.

2 голосов
/ 09 апреля 2010

На мой взгляд, самый простой способ - использовать Cython . Cython сгенерирует некоторый код на C для вас, скомпилируйте его, чтобы создать библиотеку ".so", которую вы можете загрузить из python. Это легко и безболезненно. Я предлагаю вам следовать учебному пособию, и у вас скоро должна быть такая библиотека.

Если вы хотите узнать все подробности о расширениях C Python, вам следует погрузиться в документацию Python о расширениях C .

0 голосов
/ 10 апреля 2010

Есть разные способы сделать это:

  • Используйте заголовок Python.h в своем коде C. Это дает самый быстрый код.
  • Используйте обертки вокруг заголовков Python, такие как SWIG . Код может быть немного медленнее, но вам не нужно вносить минимальные изменения в исходный код C / C ++. В большинстве случаев вам просто нужно написать файлы интерфейса SWIG , а общие объекты интегрированы с Python / PHP / Java и т. Д. Это самый простой способ начать перенос кода C / C ++.
  • Если вы более знакомы с языком Python и хотите избежать написания файлов интерфейса SWIG в стиле C / C ++, тогда Cython - лучший вариант для вас.
0 голосов
/ 10 апреля 2010

Вы можете писать расширения Python разными способами, включая Cython, SWIG, boost.python ... Вы также можете написать разделяемую библиотеку и использовать библиотеку "ctypes" для доступа к ней.

...