справочник по Python. мм isbn 9785932861578 9 785932 861578
![]()
|
Глава 25 . Различные библиотечные модули М одули, перечисленные в этом разделе, не рассматривались подробно в этой книге, однако они являются частью стандартной библиотеки Py- Py- thon. Эти модули не были описаны главным образом потому, что они либо являются слишком низкоуровневыми, либо имеют ограниченную область применения, либо их применение ограничено определенными платформа- и платформа- платформа- ми, либо устарели, либо они настолько сложные, что для их подробного ис- следования потребовалось бы написать отдельную книгу. Несмотря на то что описание этих модулей не вошло в книгу, тем не менее описание каждо- го модуля можно найти в электронной документации, по адресу http://docs. python.org/library/modname . Предметный указатель всех модулей можно также найти на странице http://docs.python.org/library/modindex.html. Модули, перечисленные в этой главе, составляют подмножество модулей, общих для Python 2 и Python 3. Если в программе используется какой-то модуль, не перечисленный здесь, есть вероятность, что он официально был признан как нерекомендуемый к использованию. В версии Python 3 имена некоторых модулей были изменены. Там, где это необходимо, новые имена указаны в круглых скобках. Службы интерпретатора Python Ниже перечислены модули, обеспечивающие дополнительные возможно- сти, имеющие отношение к языку программирования Python и к особен- Python и к особен- и к особен- ностям выполнения интерпретатора Python. Многие эти модули имеют отношение к синтаксическому анализу и компиляции исходных текстов программ на языке Python. Модуль_Описание_bdbДоступ_к_отладчику_codeБазовые_классы_интерпретатора_codeopКомпиляция_программного_кода_на_языке_Python_726'>Модуль Описание bdb Доступ к отладчику code Базовые классы интерпретатора codeop Компиляция программного кода на языке Python 726 Глава 25. Различные библиотечные модули Модуль Описание compileall Компиляция всех файлов с программным кодом на языке Python, присутствующих в каталоге copy_reg (copyreg) Регистрирует встроенные типы для использования в модуле pickle dis Дизассемблер distutils Функции для создания дистрибутивов модулей Python fpectl Управление исключениями, возникающими в операциях с плавающей точкой imp Доступ к реализации инструкции import keyword Проверяет, является ли строка ключевым словом языка Python linecache Извлекает строки из исходных файлов modulefinder Поиск модулей, используемых сценарием parser Доступ к деревьям парсинга исходного программного кода на языке Python pickletools Инструменты для разработчиков средств сериализации объ- ектов pkgutil Вспомогательные функции, используемые для упаковыва- ния программ pprint Форматированный вывод объектов pyclbr Извлекает информацию для классов броузеров py_compile Компиляция исходного программного кода на языке Python в файлы с байт-кодом repr (reprlib) Альтернативная реализация функции repr() symbol Константы, используемые для внутреннего представления узлов деревьев парсера tabnanny Определение некорректного оформления отступов test Пакет регрессивного тестирования token Конечные узлы дерева парсинга tokenize Сканер исходного программного кода на языке Python user Парсинг пользовательских файлов с настройками zipimport Импортирование модулей из zip-архивов Обработка строк Ниже приводится перечень некоторых ранее использовавшихся модулей, признанных в настоящее время устаревшими, которые предназначены для работы со строками. (продолжение) Модули для доступа к службам операционной системы 727 Модуль Описание difflib Вычисляет различия между строками fpformat Форматирование чисел с плавающей точкой stringprep Подготовка строк к передаче через Интернет textwrap Форматирование текста Модули для доступа к службам операционной системы Следующие модули обеспечивают доступ к дополнительным службам опе- рационной системы. Некоторые функциональные возможности модулей, перечисленных здесь, уже включены в другие модули, описанные в гла- ве 19 «Службы операционной системы». Модуль Описание crypt Доступ к функции crypt системы UNIX curses Интерфейс к библиотеке curses grp Доступ к базе данных с информацией о группах pty Работа с псевдотерминалами pipes Интерфейс к конвейеру командной оболочки nis Интерфейс к службе Sun NIS platform Доступ к информации о платформе pwd Доступ к базе данных с информацией о паролях readline Интерфейс к библиотеке GNU readline rlcompleter Функция автодополнения для библиотеки GNU readline resource Информация об использовании ресурсов sched Планировщик событий spwd Доступ к теневой базе данных с информацией о паролях stat Поддержка интерпретации результатов, возвращаемых функцией os.stat() syslog Интерфейс к демону syslog в UNIX termios Управление устройствами TTY в UNIX tty Функции управления терминалами Сети Следующие модули обеспечивают поддержку редко используемых сетевых протоколов: 728 Глава 25. Различные библиотечные модули Модуль Описание imaplib Поддержка протокола IMAP nntplib Поддержка протокола NNTP poplib Поддержка протокола POP3 smtpd Сервер SMTP telnetlib Поддержка протокола Telnet Обработка и представление данных в Интернете Следующие модули обеспечивают расширенную поддержку обработки и представления данных в Интернете, которые не были рассмотрены в гла- ве 24 «Обработка и представление данных в Интернете». Модуль Описание binhex Поддержка формата BinHex4 файлов formatter Универсальные функции форматирования mailcap Обработка файлов в формате mailcap mailbox Чтение файлов почтовых ящиков в различных форматах netrc Обработка файлов в формате netrc plistlib Обработка файлов в формате Macintosh plist uu Поддержка формата uuencode файлов xdrlib Обработка данных в формате Sun XDR Интернационализация Следующие модули используются при разработке интернационализиро- ванных приложений: Модуль Описание gettext Средства обработки текста на нескольких языках locale Интерфейс к функциям интернационализации, предо- ставляемым системой Мультимедийные службы Следующие модули обеспечивают поддержку для работы с различными типами мультимедийных файлов: Различные модули 729 Модуль Описание audioop Средства для работы с «сырыми» аудиоданными aifc Чтение и запись файлов в форматах AIFF и AIFC sunau Чтение и запись файлов в формате Sun AU wave Чтение и запись файлов в формате WAV chunk Чтение блоков данных в формате IFF colorsys Преобразования между различными системами представле- ния цвета imghdr Определение типов изображений sndhdr Определение типов аудиофайлов ossaudiodev Доступ к OSS-совместимым аудиоустройствам Различные модули В следующем заключительном списке перечислены модули, которые труд- но отнести к какой-то определенной категории: Модуль Описание cmd Построчный интерпретатор команд calendar Функции создания календарей shlex Реализация простого лексического анализа sched Планировщик событий Tkinter (tkinter) Интерфейс к библиотеке Tcl/Tk для языка Python winsound Проигрывание звука в Windows Часть III . Расширение и встраивание Глава 26. Расширение и встраивание интерпретатора Python Приложение A. Python 3 Глава 26 . Расширение и встраивание интерпретатора Python Одной из наиболее мощных особенностей языка Python является возмож- Python является возмож- является возмож- ность организации взаимодействий интерпретатора с программами на языке C. Существует две основных стратегии интеграции Python с про- Python с про- с про- граммным кодом, написанным на другом языке программирования. Пер- вая: сторонние функции могут быть упакованы в модуль языка Python и импортированы с помощью инструкции import. Такие модули называют модулями расширений , потому что они расширяют возможности интерпре- татора дополнительными функциями, написанными не на языке Python. Это наиболее распространенная форма интеграции Python-C, предоставля- Python-C, предоставля- -C, предоставля- C, предоставля- , предоставля- ющая приложениям на языке Python доступ к высокопроизводительным библиотекам программного обеспечения. Другая форма интеграции Py- Py- thon-C – это встраивание, когда из программ на языке C осуществляется доступ к интерпретатору и к программам на языке Python, как к библио- Python, как к библио- , как к библио- текам. Этот подход иногда используется, когда по тем или иным причинам возникает необходимость встроить интерпретатор Python в существующий программный комплекс на языке C, обычно как некоторый механизм для работы со сценариями. В этой главе рассматриваются базовые основы программного интерфейса Python-C. Сначала будут описаны основные составляющие программного интерфейса, встроенного в интерпретатор Python, используемого при соз- Python, используемого при соз- , используемого при соз- дании модулей расширений на языке C. Этот раздел не может рассматри- C. Этот раздел не может рассматри- . Этот раздел не может рассматри- ваться как учебное руководство, поэтому тем, кто впервые сталкивается с этой темой, рекомендуется предварительно познакомиться с документом «Extending and Embedding the Python Interpreter» (Расширение и встраи- Extending and Embedding the Python Interpreter» (Расширение и встраи- and Embedding the Python Interpreter» (Расширение и встраи- and Embedding the Python Interpreter» (Расширение и встраи- Embedding the Python Interpreter» (Расширение и встраи- Embedding the Python Interpreter» (Расширение и встраи- the Python Interpreter» (Расширение и встраи- the Python Interpreter» (Расширение и встраи- Python Interpreter» (Расширение и встраи- Python Interpreter» (Расширение и встраи- Interpreter» (Расширение и встраи- Interpreter» (Расширение и встраи- » (Расширение и встраи- вание интерпретатора Python), по адресу http://docs.python.org/extending, а также со справочным руководством «Python/C API Reference Manual» (Справочное руководство по прикладному программному интерфейсу Python/C), доступному по адресу http://docs.python.org/c-api. Затем будет описан библиотечный модуль ctypes. Это чрезвычайно полезный модуль, который можно использовать для организации доступа к функциям в биб- 734 Глава 26. Расширение и встраивание интерпретатора Python лиотеках, написанных на языке C, без необходимости писать какой-либо программный код на языке C или использовать компилятор языка C. Следует отметить, что при создании сложных расширений или приложе- ний, куда внедряется интерпретатор Python, большинство программистов предпочитают обращаться к улучшенным генераторам программного кода и к библиотекам. В качестве примера можно привести проект SWIG (http:// www.swig.org ) – компилятор, который создает модули расширений Python на основе содержимого заголовочных файлов на языке C. Ссылки на этот и другие инструменты создания расширений можно найти по адресу http:// wiki.python.org/moin/IntegratingPythonWithOtherLanguages Модули расширений В этом разделе схематически описывается процедура создания собствен- ного модуля расширения на языке C для Python. Создание модуля рас- C для Python. Создание модуля рас- для Python. Создание модуля рас- Python. Создание модуля рас- . Создание модуля рас- ширения заключается в построении интерфейса между интерпретатором Python и существующими функциями, написанными на языке C. Как пра- и существующими функциями, написанными на языке C. Как пра- C. Как пра- . Как пра- вило, создание интерфейса к библиотеке на языке C начинается с создания заголовочного файла, такого, как показано ниже: /* файл : example.h */ #include #include #include ёёё typedef struct Point { double x; double y; } Point; ёёё /* Поиск наибольшего общего делителя двух целых чисел x и y */ extern int gcd(int x, int y); ёёё /* Замещает символ och на nch в строке s и возвращает количество замен */ extern int replace(char *s, char och, char nch); ёёё /* Вычисляет расстояние между двумя точками */ extern double distance(Point *a, Point *b); ёёё /* Константа препроцессора */ #define MAGIC 0x31337 Реализация этих функций находится в отдельном файле. Например: /* example.c */ #include “example.h” /* Поиск наибольшего общего делителя двух целых чисел x и y */ int gcd(int x, int y) { int g; g = y; while (x > 0) { g = x; x = y % x; y = g; } Модули расширений 735 return g; } ёёё /* Замещает символ в строке */ int replace(char *s, char oldch, char newch) { int nrep = 0; while (s = strchr(s,oldch)) { *(s++) = newch; nrep++; } return nrep; } ёёё /* Расстояние между двумя точками */ double distance(Point *a, Point *b) { double dx,dy; dx = a->x - b->x; dy = a->y - b->y; return sqrt(dx*dx + dy*dy); } Н иже приводится основная программа на языке C с функцией main(), ил- люстрирующая использование этих функций: /* main.c */ #include “example.h” int main() { /* Тест функции gcd() */ { printf(“%d\n”, gcd(128,72)); printf(“%d\n”, gcd(37,42)); } /* Тест функции replace() */ { char s[] = “Skipping along unaware of the unspeakable peril.”; int nrep; nrep = replace(s,’ ‘,’-’); printf(“%d\n”, nrep); printf(“%s\n”,s); } /* Тест функции distance() */ { Point a = { 10.0, 15.0 }; Point b = { 13.0, 11.0 }; printf(“%0.2f\n”, distance(&a,&b)); } } Ниже приводится вывод этой программы: % a.out 8 1 6 Skipping-along-unaware-of-the-unspeakable-peril. 5.00 736 Глава 26. Расширение и встраивание интерпретатора Python Прототип модуля расширения Создание модуля расширения заключается в том, чтобы создать отдель- ный файл с программным кодом на языке C, содержащий набор функций- оберток, обеспечивающих связь между интерпретатором Python и про- Python и про- и про- граммным кодом на языке C. Ниже приводится пример простого модуля расширения с именем _example: /* pyexample.c */ #include “Python.h” #include “example.h” ёёё static char py_gcd_doc[] = “Поиск НОД двух целых чисел”; static PyObject * py_gcd(PyObject *self, PyObject *args) { int x,y,r; if (!PyArg_ParseTuple(args,”ii:gcd”,&x,&y)) { return NULL; } r = gcd(x,y); return Py_BuildValue(“i”,r); } ёёё static char py_replace_doc[] = “Замещает символы в строке”; static PyObject * py_replace(PyObject *self, PyObject *args, PyObject *kwargs) { static char *argnames[] = {“s”,”och”,”nch”,NULL}; char *s,*sdup; char och, nch; int nrep; PyObject *result; if (!PyArg_ParseTupleAndKeywords(args,kwargs, “scc:replace”, argnames, &s, &och, &nch)) { return NULL; } sdup = (char *) malloc(strlen(s)+1); strcpy(sdup,s); nrep = replace(sdup,och,nch); result = Py_BuildValue(“(is)”,nrep,sdup); free(sdup); return result; } ёёё static char py_distance_doc[] = “Вычисляет расстояние между двумя точками”; static PyObject * py_distance(PyObject *self, PyObject *args) { PyErr_SetString(PyExc_NotImplementedError,”distance() not implemented.”); return NULL; } ёёё static PyMethodDef _examplemethods[] = { {“gcd”, py_gcd, METH_VARARGS, py_gcd_doc}, {“replace”, py_replace, METH_VARARGS | METH_KEYWORDS, py_replace_doc}, {“distance”,py_distance,METH_VARARGS, py_distance_doc}, {NULL, NULL, 0, NULL} Модули расширений 737 }; ёёё #if PY_MAJOR_VERSION < 3 /* Инициализация модуля в Python 2 */ void init_example(void) { PyObject *mod; mod = Py_InitModule(“_example”, _examplemethods); PyModule_AddIntMacro(mod,MAGIC); } #else /* Инициализация модуля в Python 3 */ static struct PyModuleDef _examplemodule = { PyModuleDef_HEAD_INIT, “_example”, /* имя модуля */ NULL, /* строка документирования модуля, может быть NULL */ -1, _examplemethods }; PyMODINIT_FUNC PyInit__example(void) { PyObject *mod; mod = PyModule_Create(&_examplemodule); PyModule_AddIntMacro(mod, MAGIC); return mod; } #endif М одули расширений всегда должны подключать файл “Python.h”. Для каждой функции на языке C, доступной из программного кода на языке Python, должна быть написана функция-обертка. Эти функции-обертки должны принимать два аргумента (self и args, оба типа PyObject *) или три (self, args и kwargs, все типа PyObject *). Аргумент self используется, когда функция-обертка реализует метод экземпляра некоторого класса. В этом случае экземпляр передается функции в аргументе self. В противном слу- В противном слу- противном слу- противном слу- слу- слу- чае в аргументе self передается значение NULL. Аргумент args – кортеж с аргументами функции, которые передаются интерпретатором. Аргумент kwargs – словарь с именованными аргументами. Преобразование значений аргументов из типов языка Python в типы язы- Python в типы язы- в типы язы- ка C производится с помощью функции PyArg_ParseTuple() или PyArg_Par- _Par- Par- seTupleAndKeywords() . Таким же образом для преобразования возвращаемого значения используется функция Py_BuildValue(). Эти функции будут описа- ны в следующих разделах. Строки документирования для функций в расширении должны помещать- ся в отдельные строковые переменные, например py_gcd_doc и py_replace_ doc , как было показано выше. Эти переменные используются при инициа- лизации модуля (о чем рассказывается чуть ниже). Функции-обертки никогда не должны изменять данные, полученные от интерпретатора по ссылке, даже под страхом смерти. Именно по этой при- чине функция-обертка py_replace() создает копию полученной строки, прежде чем передать ее функции на языке C (которая модифицирует саму |