Большим достоинством 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, написанный на Питоне.