Первое, что следует отметить в API встроенных вызовов Python, это меньшую его структурированность, чем у интерфейсов расширения. Для встраивания Python в C может потребоваться более творческий подход, чем при расширении: программист должен реализовать интеграцию с Python, выбирая из всей совокупности средств C, а не писать программный код, имеющий типовую структуру. Положительной стороной такой свободной структуры является возможность объединять в программах встроенные вызовы и стратегии, создавая произвольные архитектуры интеграции.
Но при встраивании Python структура не так очевидна — так как внешним уровнем является C, не совсем ясно, какой модели должен придерживаться встроенный код Python. В C может потребоваться выполнять загружаемые из модулей объекты, загружаемые из файлов или выделенные в документах строки и так далее. Вместо того чтобы решать, чего можно и чего нельзя делать в C, Python предоставляет набор общих инструментов интерфейса встраивания, применяемых и организуемых согласно целям встраивания.
Большинство этих инструментов соответствует средствам, доступным программам Python. В табл. 20.1 перечислены некоторые наиболее часто встречающиеся вызовы API, используемые для встраивания, и их эквиваленты в Python. В целом, если можно установить, как решить задачи встраивания с помощью чистого программного кода Python, то, вероятно, найдутся средства C API, позволяющие достичь таких же результатов.
Табли ца 20.1. Час то ис поль зуемые функ ции API
Эквивалент 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