Чтение онлайн

на главную - закладки

Жанры

Язык программирования Python
Шрифт:

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

Нужно отметить, что для построения интерфейса можно использовать не только чистый Tkinter. Например, в Python доступны модули ScrolledText и Tix, пополняющие набор виджетов. Кроме того, можно найти пакеты для специальных виджетов (например, для отображения дерева).

Построение графического интерфейса невизуальными способами — не такая сложная задача, если использовать Tkinter. Этот пакет входит в стандартную поставку Python и потому может использоваться почти везде, где установлен Python.

13.

Лекция: Интеграция Python с другими языками программирования.

В этой лекции рассматривается встраивание (embedding) интерпретатора Python в программу на C, и, наоборот, написание модулей для Python на языке C (extending). Кратко описывается инструмент для связывания C–библиотек с программами на Python (SWIG). Дается обзор связок языка Python с другими языками программирования: C++, Java, OCaml, Prolog. Коротко говорится о специальном языке для написания модулей расширения Python — Pyrex.

C API

Доступные из языка Python модули расширяются за счет модулей расширения (extension modules). Модули расширения можно писать на языке C или C++ и вызывать из программ на Python. В этой лекции речь пойдет о реализации Python, называемой CPython(Jython, реализация Python на платформе Java не будет рассматриваться).

Сама необходимость использования языка C может возникнуть, если реализуемый алгоритм, будучи запрограммирован на Python, работает медленно. Например, высокопроизводительные операции с массивами модуля Numeric (о котором говорилось в одной из предыдущих лекций) написаны на языке C. Модули расширения позволяют объединить эффективность порождаемого компилятором C/C++ кода c удобством и гибкостью интерпретатора Python. Необходимые сведения для создания модулей расширения для Python даны в исчерпывающем объеме в стандартной документации, а именно в документе «Python/C API Reference Manual» (справочное руководство по «Python/C API»). Здесь будут рассмотрены лишь основные принципы построения модуля расширения, без детальных подробностей об API. Стоит заметить, что возможности Python равно доступны и в C++, просто они выражены в C–декларациях, которые можно использовать в C++.

Все необходимые для модуля расширения определения находятся в заголовочном файле Python.h, который должен находится где–то на пути заголовочных файлов компилятора C/C++. Следует пользоваться теми же версиями библиотек, с которыми был откомпилирован Python. Желательно, и той же маркой компилятора C/C++.

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

Через C API доступны все встроенные возможности языка Python (при необходимости, детальнее изучить этот вопрос можно по документации):

высокоуровневый интерфейс интерпретатора (функции и макросы Py_Main, PyRun_String, PyRun_File, Py_CompileString, PyCompilerFlags и т.п.),

функции для работы со встроенным интерпретатором и потоками (Py_Initialize, Py_Finalize, Py_NewInterpreter, Py_EndInterpreter, Py_SetProgramName и другие),

управление подсчетом ссылок (макросы Py_INCREF, Py_DECREF, Py_XINCREF, Py_XDECREF, Py_CLEAR). Требуется при создании или удалении Python–объектов в C/C++-коде.

обработка исключений (PyErr*-функции и PyExc_*-константы, например, PyErr_NoMemory и PyExc_IOError)

управление процессом и сервисы операционной системы (Py_FatalError, Py_Exit, Py_AtExit, PyOS_CheckStack, и другие функции/макросы PyOS*),

импорт модулей (PyImport_Import и другие),

поддержка сериализации объектов (PyMarshal_WriteObjectToFile, PyMarshal_ReadObjectFromFile и т.п.)

поддержка анализа строки аргументов (PyArg_ParseTuple, PyArg_VaParse, PyArg_ParseTupleAndKeywords, PyArg_VaParseTupleAndKeywords, PyArg_UnpackTuple и Py_BuildValue).

С помощью этих функций облегчается задача получения в коде на C параметров, заданных при вызове функции из Python. Функции PyArg_Parse* принимают в качестве аргумента строку формата полученных аргументов,

поддержка протоколов абстрактных объектов: + Протокол объекта (PyObject_Print, PyObject_HasAttrString, PyObject_GetAttrString, PyObject_HasAttr, PyObject_GetAttr, PyObject_RichCompare, …, PyObject_IsInstance, PyCallable_Check, PyObject_Call, PyObject_Dir и другие). То, что должен уметь делать любой объект Python + Протокол числа (PyNumber_Check, PyNumber_Add, …, PyNumber_And, …, PyNumber_InPlaceAdd, …, PyNumber_Coerce, PyNumber_Int, …). То, что должен делать любой объект, представляющий число + Протокол последовательности (PySequence_Check, PySequence_Size, PySequence_Concat, PySequence_Repeat, PySequence_InPlaceConcat, …, PySequence_GetItem, …, PySequence_GetSlice, PySequence_Tuple, PySequence_Count, …) + Протокол отображения (например, словарь является отображением) (функции: PyMapping_Check, PyMapping_Length, PyMapping_HasKey, PyMapping_Keys, …, PyMapping_SetItemString, PyMapping_GetItemString и др.) + Протокол итератора (PyIter_Check, PyIter_Next) + Протокол буфера (PyObject_AsCharBuffer, PyObject_AsReadBuffer, PyObject_AsWriteBuffer, PyObject_CheckReadBuffer)

поддержка встроенных типов данных. Аналогично описанному в предыдущем пункте, но уже для конкретных встроенных типов данных. Например: + Булевский объект (PyBool_Check - проверка принадлежности типу PyBool_Type, Py_False — объект False, Py_True — объект True,

управление памятью (то есть кучей интерпретатора Python) (функции PyMem_Malloc, PyMem_Realloc, PyMem_Free, PyMem_New, PyMem_Resize, PyMem_Del). Разумеется, можно применять и средства выделения памяти C/C++, однако, в этом случае не будут использоваться преимущества управления памятью интерпретатора Python (сборка мусора и т.п.). Кроме того, освобождение памяти нужно производить тем же способом, что и ее выделение. Еще раз стоит напомнить, что повторное освобождение одной и той же области памяти (а равно использование области памяти после ее освобождения) чревато серьезными ошибками, которые компилятор C не имеет возможности распознать.

структуры для определения объектов встроенных типов (PyObject, PyVarObject и много других)

Примечание

Под протоколом здесь понимается набор методов, которые должен поддерживать тот или иной класс для организации операций со своими экземплярами. Эти методы доступны не только из Python (например, len(a) дает длину последовательности), но и из кода на C (PySequence_Length).

Написание модуля расширения

Если необходимость встроить Python в программу возникает нечасто, то его расширение путем написания модулей на C/C++ - довольно распространенная практика. Изначально Python был нацелен на возможность расширения, поэтому в настоящий момент очень многие C/C++-библиотеки имеют привязки к Python.

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

В качестве примера можно привести выдержку из исходного кода модуля md5, который реализует функцию для получения md5–дайджеста. Модуль приводится в целях иллюстрации (то есть, с сокращениями). Модуль вводит собственный тип данных, MD5Type, поэтому можно увидеть не только реализацию функций, но и способ описания встроенного типа. В рамках этого курса не изучить все тонкости программирования модулей расширения, главное понять дух этого занятия. На комментарии автора курса лекций указывает двойной слэш //:

Поделиться:
Популярные книги

Идеальный мир для Лекаря 24

Сапфир Олег
24. Лекарь
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Идеальный мир для Лекаря 24

Кодекс Крови. Книга ХIV

Борзых М.
14. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХIV

Гримуар темного лорда VII

Грехов Тимофей
7. Гримуар темного лорда
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда VII

Имя нам Легион. Том 18

Дорничев Дмитрий
18. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 18

Адвокат Империи 4

Карелин Сергей Витальевич
4. Адвокат империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Адвокат Империи 4

Князь Андер Арес 4

Грехов Тимофей
4. Андер Арес
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Князь Андер Арес 4

Двойник короля 20

Скабер Артемий
20. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 20

Воронцов. Перезагрузка. Книга 5

Тарасов Ник
5. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
фантастика: прочее
6.00
рейтинг книги
Воронцов. Перезагрузка. Книга 5

Хозяин Теней 3

Петров Максим Николаевич
3. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Хозяин Теней 3

Кодекс Охотника. Книга V

Винокуров Юрий
5. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.50
рейтинг книги
Кодекс Охотника. Книга V

Гримуар темного лорда VIII

Грехов Тимофей
8. Гримуар темного лорда
Фантастика:
боевая фантастика
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Гримуар темного лорда VIII

Горизонт Вечности

Вайс Александр
11. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Горизонт Вечности

Черный Маг Императора 7 (CИ)

Герда Александр
7. Черный маг императора
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 7 (CИ)

Играть... в тебя

Зайцева Мария
3. Звериные повадки Симоновых
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Играть... в тебя