Обзор API встраивания в C

obzor api vstraivaniya v c Интеграция Python/C

Первое, что следует отметить в API встроенных вызовов Python, это меньшую его структурированность, чем у интерфейсов расширения. Для встраивания Python в C может потребоваться более творческий подход, чем при расширении: программист должен реализовать интеграцию с Python, выбирая из всей совокупности средств C, а не писать программный код, имеющий типовую структуру. Положительной стороной такой свободной структуры является возможность объединять в программах встроенные вызовы и стратегии, создавая произвольные архитектуры интеграции.

Отсутствие строгой модели встраивания в значительной мере является результатом менее четко обозначенных целей. При рас шире нии Python есть четкое разделение ответственности между Python и C и ясная структура интеграции. Модули и типы C должны соответствовать модели модулей/типов Python путем соблюдения стандартных структур расширений. В результате интеграция оказывается незаметной для клиентов Python: расширения C выглядят, как объекты Python, и выполняют большую часть работы. При этом имеются дополнительные инструменты, такие как SWIG, обеспечивающие автоматизацию интеграции.

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

Большинство этих инструментов соответствует средствам, доступным программам Python. В табл. 20.1 перечислены некоторые наиболее часто встречающиеся вызовы API, используемые для встраивания, и их эквиваленты в Python. В целом, если можно установить, как решить задачи встраивания с помощью чистого программного кода Python, то, вероятно, найдутся средства C API, позволяющие достичь таких же результатов.

Табли ца 20.1. Час то ис поль зуемые функ ции API

подпись: вызов c api
pyimport_importmodule pyimport_getmoduledict pymodule_getdict
pydict_getitemstring pydict_setitemstring pydict_new
pyobject_getattrstring pyobject_setattrstring pyobject_callobject pyeval_callobject pyrun_string
pyrun_file
Эквивалент Python import module, __import__ sys.modules module.__dict__ dict[key] dict[key]=val dict = {} getattr(obj, attr) setattr(obj, attr, val) funcobj(*argstuple) funcobj(*argstuple) eval(exprstr), exec(stmtstr) exec(open(filename().read())

Так как встраивание основывается на выборе вызова API, знакомство с Python C API совершенно необходимо для решения задач встраивания. В этой главе представлен ряд характерных примеров встраивания и обсуждаются стандартные вызовы API, но нет полного списка всех имеющихся в нем инструментов. Разобравшись с приведенными примерами, возможно, вы обратитесь к руководствам Python по интеграции за дополнительными сведениями о том, какие вызовы есть в этой области. Как уже упоминалось выше, в Python есть два стандартных руководства для программистов, занимающихся интеграцией с C/C++: «Extending and Embedding», учебник по интеграции, и «Python/C API», справочник по библиотеке времени выполнения Python.

Самые свежие версии этих руководств можно найти на сайте http:// www.python.org, и, возможно, они уже были установлены на вашем компьютере вместе с самим Python. Помимо данной главы эти два руководства послужат лучшим источником свежей и полной информации по средствам Python API.

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий