Главная страница
Навигация по странице:

  • Службы интерпретатора Python

  • Модуль Описание bdbДоступ к отладчику codeБазовые классы интерпретатора codeopКомпиляция программного кода на языке Python 726

  • Модуль Описание

  • Модули для доступа к службам операционной системы

  • Обработка и представление данных в Интернете

  • Интернационализация Следующие модули используются при разработке интернационализиро- ванных приложений:Модуль Описание

  • Мультимедийные службы Следующие модули обеспечивают поддержку для работы с различными типами мультимедийных файлов: Различные модули729 Модуль

  • Различные модули В следующем заключительном списке перечислены модули, которые труд- но отнести к какой-то определенной категории:Модуль Описание

  • Часть III . Расширение и встраивание Глава 26. Расширение и встраивание интерпретатора PythonПриложение A.

  • справочник по Python. мм isbn 9785932861578 9 785932 861578


    Скачать 4.21 Mb.
    Названиемм isbn 9785932861578 9 785932 861578
    Анкорсправочник по Python
    Дата08.05.2022
    Размер4.21 Mb.
    Формат файлаpdf
    Имя файлаBizli_Python-Podrobnyy-spravochnik.440222.pdf
    ТипСправочник
    #518195
    страница65 из 82
    1   ...   61   62   63   64   65   66   67   68   ...   82
    Глава
    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 (которая модифицирует саму

    1   ...   61   62   63   64   65   66   67   68   ...   82


    написать администратору сайта