[ Россум, Дрейк, Откидач ] Язык программирования Python
.pdf
20.1. pickle и cPickle — представление объектов в виде . . . |
261 |
persistent_load(id_string)
Этот метод (функция или любой другой объект, поддерживающий вызов) вызывается для восстановления ссылки на постоянный объект по строкеидентификатору id_string, которая при “консервации” была возвращена методом persistent_id(). Изначально метод persistent_load() не определен.
Вы можете несколько раз вызывать метод dump() объекта Pickler. Для восстановления всех “законсервированных” объектов необходимо будет столько же раз вызвать метод load() соответствующего объекта Unpickler(). Если один и тот же объект “консервируется” несколько раз методом dump() одного и того же объекта Pickler, метод load() восстановит ссылки на один и тот же объект. Предполагается, что “консервация” нескольких объектов производится без внесения в них изменений в промежутке между вызовами метода load(). Если Вы измените объект и затем повторно “законсервируете” его с помощью того же объекта Pickler, объект не будет “законсервирован” — сохранится лишь ссылка на старое значение.
Кроме конструкторов Pickler() и Unpickler(), модули определяют следующие функции и объекты данных:
dump(object, file [, bin])
“Консервирует” объект object в файл file. Эквивалентно вызову ‘Pickler(file, bin).dump(object)’.
load(file)
Восстанавливает “законсервированный” объект из файла file и возвращает его.
dumps(object [, bin])
Возвращает “законсервированное” представление объекта в виде строки вместо того, чтобы записывать его в файл.
loads(string)
Восстанавливает “законсервированный” объект из строки string и возвращает его.
format_version
Строка-версия формата, используемого при “консервации”.
compatible_formats
Список старых версий (строк) формата данных, которые, помимо текущей версии (format_version), могут быть восстановлены.
Ниже приведена иерархия исключений, которые используются модулями pickle и cPickle при возникновении ошибок (до версии 2.0 исключения определены в виде строк, что сильно затрудняет их обработку):
PickleError
Базовый класс для всех исключений, является производным от стандартного класса исключений Exception.
262 |
Глава 20. Сохранение и копирование объектов |
PicklingError
Класс исключений, которые генерируются при попытке “законсервировать” объект, который не может быть “законсервирован”.
UnpicklingError
Класс исключений, которые генерируются при восстановлении объекта, если его конструктор не зарегистрирован (см. описание модуля copy_reg).
Ниже приведен список объектов, которые могут быть “законсервированы”:
None;
Целые, длинные целые и вещественные числа.
Простые строки и строки Unicode.
Кортежи, списки и словари, содержащие только объекты, которые могут быть “законсервированы”.
Классы и функции, определенные в глобальном пространств имен модуля (на самом деле запоминаются только имена модуля и функции).
Экземпляры классов, атрибут __dict__ которых может быть “законсервирован”.
Экземпляры классов, имеющих соответствующие методы протокола копирования (см. раздел ??).
Объекты, поддержка которых зарегистрирована с помощью модуля copy_reg. Именно таким образом осуществляется поддержка комплексных чисел.
20.2shelve — сохранение объектов в базе данных в стиле DBM
С помощью этого модуля Вы можете создать “стеллаж” (shelf) — объект с интерфейсом словаря, который позволяет сохранять в базе данных в стиле DBM объекты в “законсервированном” виде. Для консервации используется модуль cPickle или pickle, если первый недоступен.
open(filename [, flag])
Открывает файл filename с базой данных в стиле DBM и на его основе создает и возвращает объект-стеллаж. Флаг flag используется в качестве второго аргумента в функции anydbm.open() (см. описание модуля anydbm).
Объекты-стеллажи поддерживают большинство операций, характерных для отображений (см. раздел 11.3): доступ к объектам по ключу, добавление и удаление записей,
20.3. marshal — байт-компилированное представление объектов |
263 |
методы has_key(), keys(), get(). В качестве ключа могут использоваться только обычные строки. Методы sync() и close() вызывают соответствующие методы объекта, представляющего базу данных.
Модуль shelve не поддерживает одновременного доступа, если при этом производится запись в базу данных. Одновременный доступ на чтение в принципе безопасен.
20.3marshal — байт-компилированное представление объектов
Этот модуль позволяет получить байт-компилированное представление объектов кода (code), а также сопутствующих им объектов: None; объектов, которые могут быть представлены литеральными выражениями (любые числа и строки); кортежей, списков и словарей, содержащих только объекты, для которых может быть получено байткомпилированное представление. Попытка получить байт-компилированное представление для рекурсивных объектов (содержащих ссылки на самих себя) приведет к зацикливанию. Формат байт-компилированного кода специфичен для языка Python, но не зависит от платформы. marshal не является модулем общего назначения. Для сохранения и передачи объектов следует использовать модули pickle, cPickle и shelve.
Модуль определяет следующие функции:
dump(object, file)
Записывает байт-компилированное представление объекта object в файл. Аргумент file должен быть объектом типа file, открытым для записи в двоичном режиме (’wb’ или ’w+b’). Если для объекта object не может быть получено байт-компилированное представление, генерируется исключение ValueError, но при этом в файл будет записан “мусор”, который не будет корректно считан функцией load().
load(file)
Считывает байт-компилированное представление для одного объекта из файла, восстанавливает его и возвращает. Если данные в файле не могут быть корректно обработаны, в зависимости от ситуации генерируется одно из исключений EOFError, ValueError или TypeError. Аргумент file должен быть объектом типа file, открытым для чтения в двоичном режиме (’rb’ или ’r+b’).
dumps(object)
Возвращает строку с байт-компилированным представлением объекта object.
loads(string)
Восстанавливает объект из байт-компилированного представления string. Лишние символы в строке игнорируются.
264 |
Глава 20. Сохранение и копирование объектов |
20.4struct — преобразование объектов в структуры языка C
Этот модуль позволяет преобразовывать значения некоторых объектов в структуры языка C в виде строк и обратно. Данные в строке располагаются в соответствии со строкой формата. Эти возможности могут быть использованы для чтения и сохранения двоичных данных, пересылки данных через сетевое соединение.
error
Класс исключений, которые генерируются при различных ошибках. В качестве аргумента используется строка, описывающая подробности.
pack(format, value1 ...)
Возвращает строку, содержащую значения value1 ..., упакованные в соответствии с форматом. Количество и тип аргументов должны соответствовать значениям, которые требует строка формата format.
unpack(format, string)
Распаковывает строку string в соответствии с форматом format и возвращает кортеж объектов. Строка должна содержать ровно такое количество данных, которое требует строка формата, то есть длина строки должна быть равной calcsize(format).
calcsize(format)
Возвращает размер структуры (то есть длину строки), соответствующей формату format.
Символы строки формата имеют следующее значение:
Символ |
Тип языка C |
Тип объекта в языке Python |
x |
— (пустой байт) |
— (пустой байт) |
c |
char |
символ (строка длиной 1) |
b |
signed char |
int |
B |
unsigned char |
int |
h |
short |
int |
H |
unsigned short |
int |
i |
int |
int |
I |
unsigned int |
long int (int, если в языке C тип int меньше, |
|
|
чем long) |
l |
long |
int |
L |
unsigned long |
long int |
f |
float |
float |
d |
double |
float |
s |
char[] |
string |
p |
char[] |
string |
P |
void * |
int |
|
|
|
20.4. struct — преобразование объектов в структуры языка C |
265 |
Перед символом формата может идти число, обозначающее количество повторений. Например, строка формата ’4h’ полностью эквивалентна строке ’hhhh’. Символы пропуска между символами формата игнорируются, однако символы пропуска между числом и символом формата не допускаются.
Число перед символом формата ‘s’ интерпретируется как длина строки, а не число повторений. То есть ’10s’ обозначает строку из 10 символов, в то время как ’10c’ — 10 раз по одному символу. При упаковке строки урезаются или дополняются до нужной длины символами с кодом 0. При распаковке строки имеют указанную в строке формата длину.
Символ формата ‘p’ может быть использован для упаковки строк в стиле языка Pascal. В этом случае первый байт является длиной строки, затем следует сама строка. Число перед символом ‘p’ указывает на длину строки вместе с байтом, в котором сохранится длина строки.
По умолчанию для представления используется “родной” для данной платформы формат и порядок следования байтов. Поместив в начало строки формата один из описанных ниже символов, Вы можете определить порядок следования байтов, размер и выравнивание структур.
Символ |
Порядок следования байтов |
Размер и выравнивание |
@ |
родной |
родные |
= |
родной |
стандартные |
< |
little-endian |
стандартные |
> |
big-endian |
стандартные |
! |
общепринятый в сети (= big-endian) |
стандартные |
|
|
|
Символ формата ‘P’ может быть использован только с “родным” порядком следования байтов.
Для того, чтобы выравнять конец структуры в соответствии с определенным типом, можно поместить в конец строки формата символ, определяющий этот тип с числом повторения равным 0. Например, формат ’llh0l’ определяет дополнительные два байта в конце (подразумевая, что тип long выравнивается в рамках четырех байтов). Этот способ работает только с “родными” размером и выравниванием.
Приведем небольшой пример использования модуля struct (платформа Intel, little-endian):
>>>from struct import *
>>>pack(’hhl’, 1, 2, 3) ’\001\000\002\000\003\000\000\000’
>>>unpack(’hhl’, ’\001\000\002\000\003\000\000\000’) (1, 2, 3)
>>>calcsize(’hhl’)
8
266
Глава 21
Доступ к средствам, предоставляемым операционной системой
Модули, описанные в этой главе, предоставляют общий интерфейс к службам, доступным во всех (или почти всех) операционных системах.
os |
Основные службы операционной системы. |
os.path |
Работа с именами путей. |
stat |
Средства для интерпретации значений, возвращаемых функциями |
|
os.stat(), os.lstat() и os.fstat(). |
statvfs |
Константы, предназначенные для интерпретации значений, возвращае- |
|
мых функцией os.statvfs(). |
filecmp |
Сравнение файлов и каталогов. |
popen2 |
Доступ к потокам ввода/вывода дочерних процессов. |
time |
Определение и обработка времени. |
sched |
Планировщик задач общего назначения. |
getpass |
Переносимый способ запросить пароль и определить имя пользователя. |
getopt |
Обработка опций в командной строке. |
tempfile |
Создание временных файлов. |
errno |
Символические имена стандартных системных ошибок. |
glob |
Раскрытие шаблона имен путей в стиле UNIX shell. |
fnmatch |
Сопоставление имен файлов с шаблоном в стиле UNIX shell. |
shutil |
Операции над файлами высокого уровня. |
signal |
Обработка асинхронных событий. |
socket |
Сетевой интерфейс низкого уровня. |
select |
Асинхронные операции ввода/вывода с участием нескольких файловых |
|
дескрипторов. |
mmap |
Отображение файлов в память. |
21.1. os — основные службы операционной системы |
267 |
21.1os — основные службы операционной системы
Модуль os позволяет переносимо использовать основные службы операционной системы (ОС). Этот модуль производит поиск встроенного модуля, характерного для данной ОС (posix, nt, mac и др.) и экспортирует определенные в нем функции и объекты данных. Модуль спроектирован таким образом, чтобы обеспечить одинаковый интерфейс в тех случаях, когда для разных ОС доступны одинаковые возможности. Функции, определенные только для некоторых ОС также доступны через модуль os, однако их использование не переносимо.
error
Является ссылкой на встроенный класс исключений OSError (см. раздел 13).
name
Имя зависящего от ОС модуля. В настоящее время могут быть использованы следующие имена: ’posix’, ’nt’, ’dos’, ’mac’, ’os2’, ’ce’, ’java’.
path
Ссылка на зависящий от операционной системы модуль для работы с именами файлов и путями, например, posixpath или macpath. Этот модуль может быть импортирован напрямую как os.path.
strerror(code) (UNIX, Windows) Возвращает строку с сообщением о системной ошибке, соответствующим коду code.
21.1.1Параметры процесса
Функции и объекты данных, описанные в этом разделе, предоставляют информацию и средства управления для текущего процесса.
environ
Отображение имен переменных окружения к их значениям. Например, environ[’HOME’] дает значение переменной окружения HOME. Если на используемой платформе доступна функция putenv(), отображение environ может быть также использовано для изменения значений переменных окружения. Функция putenv() автоматически вызывается при внесении изменений в environ. Если функция putenv() не доступна, Вы можете использовать измененное отображение в качестве аргумента функции, создающей дочерний процесс.
chdir(path)
getcwd()
Эти функции описаны в разделе 21.1.4.
268 |
Глава 21. |
Доступ к средствам, предоставляемым операционной . . . |
ctermid() |
(UNIX) |
|
|
Возвращает имя файла, соответствующего контролируемому текущим процессом |
|
|
терминалу. |
|
getegid() |
(UNIX) |
|
|
Возвращает идентификатор эффективной группы пользователей текущего процес- |
|
|
са. |
|
geteuid() |
(UNIX) |
|
|
Возвращает идентификатор эффективного пользователя текущего процесса. |
|
getgid() |
(UNIX) |
|
|
Возвращает идентификатор группы пользователей текущего процесса. |
|
getgroups() |
(UNIX) |
|
|
Возвращает список идентификаторов дополнительных групп, ассоциированных с |
|
|
текущим процессом. |
|
getlogin() |
(UNIX) |
|
|
Возвращает настоящее регистрационное имя пользователя для текущего процесса, |
|
|
даже если существует несколько таких имен для одного и того же идентификатора |
|
|
пользователя. |
|
getpgrp() |
(UNIX) |
|
|
Возвращает идентификатор группы процессов текущего процесса. |
|
getpid() |
(UNIX, Windows) |
|
|
Возвращает идентификатор текущего процесса. |
|
getppid() |
(UNIX) |
|
|
Возвращает идентификатор родительского процесса. |
|
getuid() |
(UNIX) |
|
|
Возвращает идентификатор пользователя текущего процесса. |
|
putenv(varname, value) |
(большинство вариантов UNIX, Windows) |
|
|
Устанавливает значение переменной окружения с именем varname равным строке |
|
|
value. Эти изменения отражаются на дочерних процессах. |
|
setegid(egid) |
(UNIX) |
|
|
Устанавливает идентификатор эффективной группы пользователей текущего про- |
|
|
цесса равным egid. |
|
seteuid(euid) |
(UNIX) |
|
|
Устанавливает идентификатор эффективного пользователя текущего процесса рав- |
|
|
ным euid. |
|
setgid(gid) |
(UNIX) |
|
|
Устанавливает идентификатор группы пользователей текущего процесса равным |
|
egid.
21.1. os — основные службы операционной системы |
269 |
setpgrp() |
(UNIX) |
Устанавливает идентификатор группы процессов текущего процесса равным иден- |
|
тификатору процесса (эквивалентно вызову ‘setpgid(0, 0)’). |
|
setpgid(pid, pgrp) |
(UNIX) |
Устанавливает идентификатор группы процессов процесса с идентификатором pid равным pgrp. Аргумент pid равный 0 обозначает текущий процесс. Если аргумент pgrp равен 0, в качестве идентификатора группы используется идентификатор процесса.
setreuid(ruid, euid) |
|
|
(UNIX) |
|
Устанавливает идентификаторы реального и эффективного пользователей текущего |
||||
процесса равными ruid и euid соответственно. |
|
|
||
setregid(rgid, egid) |
|
|
(UNIX) |
|
Устанавливает идентификаторы реальной и эффективной групп пользователей те- |
||||
кущего процесса равными rgid и egid соответственно. |
|
|
||
setsid() |
|
|
|
(UNIX) |
Создает новые сессию и группу процессов с идентификаторами, равными иденти- |
||||
фикатору текущего процесса. |
|
|
||
setuid(uid) |
|
|
|
(UNIX) |
Устанавливает идентификатор пользователя текущего процесса равным uid. |
||||
umask(mask) |
|
|
(UNIX, Windows) |
|
Устанавливает маску прав на доступ к файлам, которые будут созданы текущим |
||||
процессом. |
|
|
|
|
uname() |
|
(некоторые современные варианты UNIX) |
||
Возвращает |
кортеж из |
пяти строк: имя системы, имя узла, выпуск, |
||
версия, тип |
машины. |
Некоторые системы обрезают |
имя узла, |
поэто- |
му лучше воспользоваться вызовом socket.gethostname() или даже |
||||
socket.gethostbyaddr(socket.gethostname()) (см. |
описание |
модуля |
||
socket). |
|
|
|
|
21.1.2 Создание файловых объектов
Приведенные ниже функции создают новые файловые объекты.
fdopen(fd [, mode [, bufsize]]) (UNIX, Windows, Macintosh) Возвращает файловый объект, связанный с файловым дескриптором fd. Аргументы mode и bufsize имеют такое же значение, как и соответствующие аргументы встроенной функции open().
270 |
Глава 21. Доступ к средствам, предоставляемым операционной . . . |
|
popen(command [, mode [, bufsize]]) |
(UNIX, Windows) |
|
Создает канал (pipe) с командой command и возвращает связанный с ним файловый объект. Вы можете читать вывод команды из файлового объекта или записывать в него входные данные в зависимости от режима mode: ’r’ (чтение, используется по умолчанию) или ’w’ (запись). Аргумент bufsize имеет такое же значение, как и соответствующий аргумент встроенной функции open(). Код завершения выполненной команды (в формате, аналогичном формату результата функции wait()) возвращается методом close() файлового объекта. Однако, если выполнение команды завершилось успешно (код завершения равен 0), метод close() возвращает None.
В предыдущих версиях под Windows эта функция вела себя ненадежно из-за некорректной работы функции _popen() библиотеки Windows. Начиная с версии 2.0, используется новая реализация.
tmpfile() (UNIX) Создает и возвращает файловый объект для временного файла, открытого в режиме обновления (’w+’). Этот файл будет автоматически удален после уничтожения всех ассоциированных с ним файловых дескрипторов.
Для всех функций вида popen*() аргумент bufsize определяет размер буфера каналов и mode — режим, в котором будут открыты каналы (’t’ — текстовый, используется по умолчанию, или ’b’ — двоичный). Аналогичные функции доступны в модуле popen2, но элементы возвращаемого кортежа для них располагаются в ином порядке.
popen2(cmd |
[, bufsize [, mode]]) |
(UNIX, Windows) |
Выполняет команду cmd в качестве дочернего процесса и возвращает кортеж из |
||
файловых объектов, соответствующих его стандартным потокам ввода и вывода. |
||
Функция доступна, начиная с версии 2.0. |
|
|
popen3(cmd |
[, bufsize [, mode]]) |
(UNIX, Windows) |
Выполняет команду cmd в качестве дочернего процесса и возвращает кортеж из файловых объектов, соответствующих его стандартным потокам ввода, вывода и ошибок. Функция доступна, начиная с версии 2.0.
popen4(cmd [, bufsize [, mode]]) (UNIX, Windows) Выполняет команду cmd в качестве дочернего процесса и возвращает кортеж из двух файловых объектов: соответствующий его стандартному потоку ввода и объединенному потоку вывода и ошибок. Функция доступна, начиная с версии 2.0.
21.1.3 Операции с файловыми дескрипторами
В этом разделе описаны операции низкого уровня над потоками с использованием файловых дескрипторов.
close(fd) |
(UNIX, Windows, Macintosh) |
Закрывает файловый дескриптор fd. |
|
