Язык программирования Python - стандартная библиотека.

Автор: Олег Бройтман
http://phd.pp.ru/
phd@phd.pp.ru

Это четвертая статья данного цикла лекций.

Перепечатка. Оригинал статьи опубликован по адресу http://www.softerra.ru/review/oses/linux/12913/

Язык программирования Python - стандартная библиотека

Большим достоинством Python как инструмента программиста является стандартная библиотека, входящая в дистрибутив. Первое, с чем сталкивается программист - это, конечно, встроенные типы данных (я их уже рассматривал), встроенные исключения, и встроенные функции. Список их невелик, и программисты, скажем, перешедшие с Перла, привыкшие, что у них сразу есть функции для манипуляций со строками, с датой и временем, регулярные выражения - спрашивают "да есть у вас в Питоне вообще хоть что-нибудь?" Все есть, только не в списке встроенных функций, а в модулях стандартной библиотеки. Манипуляции со строками делаются с помощью модуля string, дата и время приходят из модуля time, регулярные выражения в модуле re, доступ к функциям операционной системы - модуль os, и так далее.

Рассмотрим подробнее стандартную библиотеку Питона. Библиотека состоит из нескольки разделов. Во-первых, модули, дающие доступ к внутренностям интерпретатора и особенностям языка и реализации. Во-вторых, модули для манипуляции со строками, в том числе и с юникодовыми строками. Модули, дающие доступ к системной библиотеке, в первую очередь математические функции. Модули для написания тестов в стиле Extreme Programming. Модули для (относительно) переносимого способа доступа к функциям операционной системы. В библиотеку же входит простой пошаговый отладчик и профилировщик - средство нахождения "узких мест" кода. Отдельный большой раздел библиотеки - сетевые протоколы и средства Интернет; Python - отличный инструмент для написания клиентов и серверов, CGI, парсеров HTML/XML и т.д.

Рассмотрим некоторые из этих разделов поподробнее. Первый важный модуль - sys, модуль доступа к Системе. Не операционной системе, а Системе. То есть к интерпретатору. Самая популярная функция из этого модуля - exit, то есть завершение работы интерпретатора. Впрочем, она в модуле не единственная. Еще есть функции получения информации о последнем исключении, хуки для отладчиков и профилировщиков, и тому подобные "потроха" интерпретатора. Несколько интересных переменных - стандартные потоки ввода/вывода - stdin, stdout и stderr.

Еще несколько модулей, тесно связанных с интерпретатором. Модуль gc позволяет управлять сборкой мусора. Модуль atexit дает возможность каждому модулю зарегистрировать функцию деинициализации, которая вызовется при завершении программы. В модуле types перечислены все встроенные типы данных, так что программист может выполнить проверку if type(myvar) == types.ListType...

Модуль inspect - для интроспекции объектов во время выполнения. Модуль traceback позволяет получить и распечатать информацию об исключении. Parser действительно дает доступ ко внутреннему парсеру языка, а imp позволяет управлять импортом модулей. Казалось бы, зачем им управлять? Очень просто - вдруг программа распространяется в нестандартном виде или на нестандартном носителе, скажем, в zip-файле. Тут возможность импортировать модули особенным образом программисту сильно пригодится.

Модули marshal, pickle и shelve позволяют сериализовать объекты, то есть превращать их в поток байт, который потом можно сохранить в файл или передать по сети. Впоследствии сериализованные объекты можно восстановить средствами тех же модулей. Marshal умеет сериализовать только встроенные типы данных, включая питоновский байт-код. Этот модуль используется самим интерпретатором для загрузки сохраненного байт-кода из файла при импорте модуля. Pickle не умеет сериализовать и восстанавливать байт-код, и это сделано специально, для безопасности, чтобы программист был уверен, что не получит по сети вирус в байт-коде. Зато у pickle есть средства, с помощью которых программист может управлять сериализацией и восстановлением своих объектов. Модуль shelve позволяет сохранять сериализованные объекты в дисковых хешах (BerkeleyDB, (G/N)DBM). Модули dumbdbm, dbm, gdbm, bsddb дают доступ к соответствующим встраиваемым базам данных; модуль anydbm является оболочкой с единым API, который позволяет использовать любую из имеющихся БД; модуль whichdb позволяет определить, в каком формате текущая БД.

String - модуль для манипуляции со строками без регулярных выражений. Здесь собраны функции для поиска подстроки в строке, замены и тому подобное. Регулярные выражения - в модуле re. Долгое время этот модуль был интерфейсом к библиотеке PCRE (Perl-Compatible Regular Expressions), но в Python 2.0 был полностью переписан для того чтобы работать не только с ASCII-строками, но и с юникодом. Модуль locale дает доступ к функциям локализации, имеющимся в операционной системе; при установки локали этот модуль модифицирует переменные модуля string в соответствии с установленной локалью.

Модули для интерфейса с операционной системой. Первый из них - модуль os. В нем собраны функции для для управления файловой системой и процессами. Модуль thread содержит низкоуровневый переносимый интерфейс к потокам (нитям, "легким" процессам) операционной системы. Модуль threading содержит классы-высокоуровневые оболочки модуля thread в стиле Java; здесь есть классы Thread, Lock, Condition, Event, Semaphore. Модуль mmap дает переносимый интерфейс к отображаемым в память файлам. Модули glob и fnmatch позволяют манипулировать шаблонами имен файлов. Библиотека signal позволяет устанавливать обработчики для асинхронных событий (POSIX signals в тех ОС, которые эти сигналы поддерживают).

Отдельной группой стоят модули, специфичные для юникса: posix и posixfile (низкоуровневые части модуля os), pwd и grp (доступ к функциям паролей, получение информации о пользователях и группах пользователей), модуль crypt, модули tty и pty (функции терминала и псевдотерминала), модуль fcntl (доступ к системным вызовам fcntl и ioctl), модуль resource (системные вызовы get/set-rlimit, getrusage), модуль syslog, модули pipes и cmd.

Есть модули для доступа к внешним библиотекам. Модули zlib/gzip/zipfile дают доступ к соответствующим функциям компрессии (архивирования). Модули readline и rlcompleter - к библиотеке GNU readline. Библиотеки math, cmath, random дают программисту доступ к широкому спектру математических функций.

Несколько модулей криптографии, из которых 2 для доступа не к алгоритмам шифрования и дешифрования, а к хешам - модули md5 и sha. Модули Bastion и rexec позволяют создавать защищенные среды и выполнять в них код, которому программист не доверяет, например, код, переданный по сети. Программист сам управляет степенью доверия, и сам определяет, какое подмножество встроенных функций и стандартных модулей будет доступно в такой среде.

В дистрибутив Питона входит интерфейс к графической библиотеке Tk (на самом деле в этом интерфейсе спрятан полноценный Tcl :), сами Tcl/Tk в дистрибутив не входят, их надо ставить отдельно. Есть несколько простых модулей для манипулирования аудиофайлами и файлами изображений.

Сетевые протоколы

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

Эта часть библиотеки устроена иерархически, модули здесь зависят друг от друга и друг друга интенсивно используют. В самом низу находятся модули socket и select. Модуль socket предоставляет объектно-ориентированный интерфейс к функциям сетевых библиотек ОС. Поддерживаются все виды сокетов и все сетевые протоколы - TCP/IP (включая IPv6), UNIX domain, IPX/SPX, и т.д. Модуль select дает доступ к системным вызовам select и poll.

Модуль cgi - модуль номер один для написания CGI-скриптов. Модуль дает доступ к переданной от браузера форме, позволяет проверить наличие данных, извлечь и обработать эти данные и т.п.

Модули httplib, ftplib, gopherlib, poplib, imaplib, nntplib, smptlib, telnetlib дают доступ к клиентским частям соответствующих протоколов. Библиотека urllib позволяет иметь доступ к сетевым ресурсам, задаваемым URL; она, конечно, использует библиотеки httplib, ftplib и nntplib. Библиотека urllib2 - более сложная версия urllib; она содержит код для доступа к сетевым ресурсам через прокси с авторизацией. Модуль Cookie позволяет создавать и обрабатывать "куки" - блоки информации, пересылаемые между браузером и HTTP-сервером в целях создания сессий.

Помимо клиентских протоколов, библиотека Питона содержит и средства создания серверов. Модуль SocketServer содержит базовые классы, на основе которых пишутся как потоковые (TCP), так и датаграммные (UDP) серверы, как многопроцессные (использующие os.fork()), так и многопоточные (multithreading). Модуль BaseHTTPServer содержит базовые классы для создания HTTP-серверов. Модуль SimpleHTTPServer развивает эти базовые классы и позволяет программисту писать реакции на запросы GET, HEAD и POST. Модуль CGIHTTPServer позволяет расширять функциональность сервера внешними программами. Модули asyncore и asynchat позволяют писать асинхронные (на основе select/poll) клиенты и серверы. Наиболее известные асинхронные серверы - однопоточный многопротокольный сервер Medusa и сделанный на ее основе многопоточный ZServer, являющийся ядром сервера web-приложений Zope. Наиболее известный клиент: Asynchronous HTTP Client.

Помимо сетевых протоколов, Python позволяет манипулировать и с данными, бегающими поверх этих протоколов. Модуль rfc822 позволяет читать данные в формате соответствующего RFC и получать информацию о заголовках сообщения. Модуль mimetools расширяет rfc822 в сторону соответствующего стандарта и позволяет разбирать сложные составные сообщения. Модуль MimeWriter позволяет их создавать. Модули binhex, uu, binascii, base64, quopri позволяют кодировать и декодировать тексты. Модули mailcap, mimetypes, netrc, robotparse извлекают информацию из соответствующих файлов. Модули mailbox и mhlib позволяют читать почтовые ящики в формате UNIX mbox и MH.

Модули sgmllib, htmllib и xmllib позволяют создавать парсеры для файлов соответствующих форматов. Модуль sgmllib поддерживает подмножество SGML, достаточное лишь для обработки HTML. Модуль htmllib расширяет предыдущий модуль в сторону написания текстовых форматеров для HTML. А вот xmllib действительно содержит полноценные парсеры XML. Парсеров этих бывает 2 типа - работающих со всем деревом сразу (DOM, Document Object Model) и разбор, управляемый событиями (SAX). Библиотека эта к тому же содержит хуки, позволяющие администратору установить поверх нее другую версию, не стирая старой; существует несколько альтернативных реализаций, использующих эти хуки: PyXML и 4Suite. Все эти библиотеки используют низкоуровневый парсер Expat, который не входит в дистрибутив Питона; его надо устанавливать отдельно.

Другие модули

Помимо перечисленных модулей стандартной библиотеки, входящих в дистрибутив интерпретатора, для Питона существует масса дополнительных модулей, которые можно взять в Сети. Существует даже каталог таких модулей, называющийся Парнас. Есть даже коммерческие фирмы, выпускающие модули для Питона - и многие из этих модулей доступны свободно! На первое место я поставлю фирму Zope Corporation, свободно отдающую сервер web-приложений Zope. Кроме них известны PythonWare / Secret Labs со своими модулями PIL (Python Imaging Library), xmlrpclib, soaplib, новая версия Tkinter, Pythonware Sound Toolkit; ReportLab со своей библиотекой генерации PDF; Numerical Python - расширения Питона для эффективной обработки матриц; Scientific Python - для научных расчетов (использует NumPy); eGenix со своими модулями mxDateTime (манипуляции с датами и временем), mxtextTools (эффективная обработка текстов), mxODBC (коммерческий модуль для доступа к реляционным БД, в т.ч. и из юникса).

Существуют модули, позволяющие встраивать интерпретатор Python в Apache. Самый простой из них PyApache. Mod_Python более сложен, он интенсивнее кеширует байт-код, имеет объектно-ориентированный API, позволяет писать хендлеры для Апача. Mod_Snake позволяет писать хендлеры для Апача 2.0.

Большое количество модулей для доступа к базам данных, и не только реляционным, например PyBSDDB для доступа к BerkeleyDB3. Модули для доступа к реляционным БД удовлетворяют спецификации Python DB API 2.0: PyGreSQL для доступа к PostgreSQL (модуль входит в дистрибутив PostgreSQL); MySQLdb для доступа к MySQL.

Помимо Tk, программы с графическим интерфейсом на Питоне можно писать с использованием многих других библиотек: WxPython для WxWidgets; PyGTK для GTK; а библиотека Python XLib представляет собой полностью переписанную на Питоне библиотеку xlib! PLWM - это Window Mnager, написанный на Питоне.