Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

[ Россум, Дрейк, Откидач ] Язык программирования Python

.pdf
Скачиваний:
295
Добавлен:
25.04.2014
Размер:
1.5 Mб
Скачать

21.12. errno — символические имена стандартных системных . . .

301

ENOTDIR

Не является каталогом.

EISDIR

Является каталогом.

EINVAL

Неверный аргумент.

ENFILE

Слишком много открытых файлов в системе (переполнение таблицы файлов).

EMFILE

Слишком много открытых файлов.

ENOTTY

Неверная операция управления вводом/выводом (устройство должно быть терминалом).

ETXTBSY

Текстовый файл занят (например, при попытке выполнить файл, открытый для записи).

EFBIG

Файл слишком большой.

ENOSPC

На устройстве не осталось свободного места.

ESPIPE

Неверное перемещение указателя.

EROFS

Файловая система доступна только для чтения.

EMLINK

Слишком много ссылок.

EPIPE

Нарушен канал (pipe).

EDOM

Аргумент математической операции выходит за пределы области допустимых значений.

ERANGE

Результат математической операции не представим.

EDEADLK

Выполнение операции привело бы к взаимной блокировке.

ENAMETOOLONG

Слишком длинное имя файла.

302

Глава 21. Доступ к средствам, предоставляемым операционной . . .

ENOLCK

Блокировка записей недоступна.

ENOSYS

Функция не реализована.

ENOTEMPTY

Каталог не является пустым.

EBADMSG

Неверное сообщение.

EILSEQ

Неверная последовательность байтов.

EMSGSIZE

Слишком длинное сообщение.

ETIMEDOUT

Истекло время ожидания завершения операции.

EINPROGRESS

Операция в процессе выполнения.

21.13glob — раскрытие шаблона имен путей

Модуль glob находит все имена путей, удовлетворяющих определенному шаблону, в соответствии с правилами, используемыми в UNIX shell. Этот модуль не раскрывает имя домашнего каталога, записанного с помощью символа ‘~’, но корректно сопоставляет имена, возвращаемые функцией os.listdir() с заданным шаблоном с помощью функции fnmatch.fnmatch() (см. описание модуля fnmatch для ознакомления с синтаксисом шаблонов). Если Вы хотите раскрыть имя домашнего каталога, воспользуйтесь функцией os.path.expanduser().

glob(pathname)

Возвращает (возможно, пустой) список имен путей, удовлетворяющих шаблону pathname. Аргумент pathname должен быть строкой, содержащей имя пути (абсолютное или относительное) и, возможно, групповые символы (см. описание модуля fnmatch). Групповые символы не удовлетворяют разделителю компонент имени пути2.

Допустим, к примеру, что текущий каталог содержит только файлы ‘1.gif’, ‘2.txt’ и ‘card.gif’. Тогда функция glob() будет работать следующим образом (обратите внимание, что запись начала пути сохраняется):

2Специальные последовательности вида ’[seq]’ и ’![seq]’ не должны содержать символы разделителей имени пути, так как это приведет к некорректной работе функции.

21.14. fnmatch — сопоставление имен файлов с шаблоном

303

>>>from glob import glob

>>>glob(’./[0-9].*’) [’./1.gif’, ’./2.txt’]

>>>glob(’*.gif’) [’1.gif’, ’card.gif’]

>>>glob(’?.gif’)

[’1.gif’]

21.14fnmatch — сопоставление имен файлов с шаблоном

Этот модуль предоставляет возможность сопоставления имен файлов (каталогов) с шаблоном, содержащим групповые символы в стиле UNIX shell. Возможность использования более сложных шаблонов (регулярных выражений) предоставляет модуль re.

Шаблон может содержать следующие специальные последовательности (групповые символы):

Последовательность

Назначение

*Удовлетворяет любому количеству любых символов.

?Удовлетворяет (одному) любому символу.

[seq]

Удовлетворяет (одному) любому символу, содержащемуся в

 

последовательности seq.

[!seq]

Удовлетворяет (одному) любому символу, не содержащемуся

 

в последовательности seq.

 

 

Обратите внимание, что разделители компонент имени пути (‘/’, ‘\’, ‘:’) не имеют специального значения. Точка в начале имени файла не рассматривается отдельно и удовлетворяет групповым символам ‘*’ и ‘?’.

fnmatch(filename, pattern)

Возвращает 1, если имя файла (каталога) удовлетворяет шаблону pattern, иначе возвращает 0. Если ОС не чувствительна к регистру имен файлов, оба аргумента перед сопоставлением будут приведены к одному регистру функцией os.path.normcase(). Функция os.path.normcase() также заменяет все вхождения os.altsep на os.sep, то есть, например в Windows, символы ‘\’ и ‘/’ могут использоваться взаимозаменяемо (шаблоны ’/’ и ’\\’ удовлетворяют как ’/’, так и ’\\’).

fnmatchcase(filename, pattern)

Возвращает 1, если имя файла (каталога) удовлетворяет шаблону pattern, иначе возвращает 0. Аргументы не подвергаются никакой обработке, сравнение всегда производится с учетом регистра букв.

304 Глава 21. Доступ к средствам, предоставляемым операционной . . .

Модуль glob позволяет раскрыть шаблон, то есть найти все файлы, удовлетворяющие шаблону.

21.15shutil — операции над файлами высокого уровня

Модуль shutil предоставляет набор операций высокого уровня над файлами и коллекциями файлов.

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

copyfile(src, dst)

Копирует содержимое файла именем src в файл с именем dst. Если файл dst существует, он будет заменен.

copyfileobj(fsrc, fdst [, bufsize])

Копирует содержимое файлового (или подобного) объекта fsrc в файловый (или подобный) объект fdst. Если задан аргумент bufsize, он используется в качестве размера буфера (отрицательные значения означают, что файл не будет копироваться по частям).

copymode(src, dst)

Устанавливает у файла с именем dst биты разрешений доступа такие же, как у файла src.

copystat(src, dst)

Устанавливает у файла с именем dst биты разрешений доступа, время последнего доступа и время последнего внесения изменений такие же, как у файла src. Содержимое файла, владелец и группа остаются неизменными.

copy(src, dst)

Копирует файл с именем src в файл с именем dst. Если dst является каталогом, создает (или заменяет) в нем файл с таким же (основным) именем, как и src. Биты разрешения доступа также копируются.

copy2(src, dst)

Работает аналогично функции copy(), но также устанавливает у файла с именем dst время последнего доступа и время последнего внесения изменений такие же, как у файла src (то есть работает аналогично команде ‘cp -p’ в UNIX).

copytree(src, dst [, symlinks])

Рекурсивно копирует дерево каталогов src в dst. Каталог с именем dst не должен существовать — он будет создан. Копирование всех файлов производится с помощью функции copy2(). Если задан и является истиной аргумент symlinks, символические ссылки в исходном дереве будут представлены символическими

21.16. signal — обработка асинхронных событий

305

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

Эту функцию следует воспринимать скорее как пример (см. исходный текст модуля), нежели как реальное средство для работы с файлами.

rmtree(path [, ignore_errors [, onerror]])

Удаляет полностью дерево каталогов path. Если установлен и является истиной аргумент ignore_errors, ошибки, возникающие при удалении, будут проигнорированы, в противном случае для обработки ошибок вызывается функция onerror (или генерируется исключение, если аргумент onerror не задан).

Обработчик ошибок onerror должен поддерживать вызов с тремя аргументами: function, path и excinfo. function — функция, которая сгенерировала исключение (os.remove() или os.rmdir()), path — имя пути, которое было передано функции function, и excinfo — информация об исключении, возвращаемая функцией sys.exc_info(). Исключения, сгенерированные обработчиком ошибок, не обрабатываются.

21.16signal — обработка асинхронных событий

Этот модуль предоставляет возможность устанавливать обработчики сигналов. Несколько общих правил:

Однажды установленный обработчик сигнала остается до тех пор, пока Вы явно не восстановите исходный обработчик. Единственное исключение из этого правила — обработчик сигнала SIGCHLD, работа которого зависит от реализации на данной платформе.

Не существует способа временно заблокировать сигналы в критических местах.

Хотя обработчики сигналов и вызываются асинхронно, это может произойти только между атомными инструкциями интерпретатора Python. Это значит, что если сигнал поступает в момент длительной работы процедуры, полностью реализованной на языке C (например, использование регулярного выражения для поиска в длинном тексте), его обработка может быть отложена на произвольное время.

При поступлении сигнала во время выполнения операции ввода/вывода после завершения обработки сигнала может быть сгенерировано исключение.

Не имеет особого смысла обработка синхронных ошибок, таких как SIGFPE или

SIGSEGV.

Интерпретатор устанавливает некоторое количество обработчиков по умолчанию: сигнал SIGPIPE игнорируется (таким образом, уведомление об ошибках при работе с каналами и сетевыми соединениями может быть выполнено генерацией обычных исключений) и SIGINT генерирует исключение KeyboardInterrupt. Вы можете заменить любой из этих обработчиков.

306

Глава 21. Доступ к средствам, предоставляемым операционной . . .

Следует проявлять некоторую осторожность при использовании модуля в многопоточных программах. Основное правило: всегда вызывайте функцию signal() только в основном потоке. Любой поток может использовать функции alarm(), getsignal() и pause(), но только основной — устанавливать обработчик и получать сигнал. Таким образом, сигналы не могут быть использованы для связи между потоками — для этих целей следует использовать блокировки.

Модуль signal определяет следующие константы и функции:

SIG_DFL

Используется в качестве аргумента функции signal() и значения, возвращаемого функцией getsignal() для обозначения обработчика, который используется системой (не интерпретатором) по умолчанию.

SIG_IGN

Используется в качестве аргумента функции signal() для обозначения обработчика, игнорирующего сигнал.

SIG*

Символические константы для номеров сигналов. Модуль определяет константы только для тех сигналов, которые поддерживаются в данной системе.

NSIG

Имеет значение на единицу большее, чем максимальный номер сигнала в данной системе.

alarm(time) (UNIX) Если аргумент time не равен нулю, запрашивает посылку сигнала SIGALRM текущему процессу через time секунд. Ранее запланированная посылка сигнала при этом отменяется. Возвращает время в секундах, которое оставалось до посылки ранее запланированного сигнала. Если аргумент time равен нулю, отменяет ранее запланированную посылку сигнала и возвращает время, которое оставалось до его посылки. Если функция alarm() возвращает 0, посылка сигнала до этого не была запланирована.

getsignal(signalnum)

Возвращает текущий обработчик сигнала с номером signalnum. Возвращаемое значение может быть объектом, поддерживающим вызов, или одним из специальных значений: signal.SIG_IGN, signal.SIG_DFL или None. Значение None

означает, что обработчик не был установлен интерпретатором.

pause() (UNIX) Приостанавливает выполнение процесса до получения сигнала, после чего будет вызван соответствующий обработчик.

signal(signalnum, handler)

Устанавливает handler в качестве обработчика сигнала с номером signalnum. Аргумент handler может объектом, поддерживающим вызов, или одним из специальных значений: SIG_IGN или SIG_DFL. Возвращает предыдущий обработчик сигнала.

21.17. socket — сетевой интерфейс низкого уровня

307

Функция handler будет вызываться для обработки сигнала signalnum с двумя аргументами: номер сигнала и текущий кадр стека (или None).

В многопоточной программе при попытке вызвать эту функцию из неосновного потока генерируется исключение ValueError.

Приведем простой пример, использующий функцию alarm() для того, чтобы ограничить время ожидания открытия файла. Это может быть полезно, если файл является последовательным устройством, который может быть не включенным. Использование функции os.open() для таких файлов приведет к зависанию. Для того, чтобы решить эту проблему, можно перед открытием файла запросить посылку сигнала SIGALRM через 5 секунд: если операция займет слишком много времени, будет послан сигнал и обработчик сгенерирует исключение.

import signal, os

def handler(signum, frame):

raise IOError("Couldn’t open device!")

#хУФБОБЧМЙЧБЕН ПВТБВПФЮЙЛ signal.signal(signal.SIGALRM, handler)

#ъБРТБЫЙЧБЕН РПУЩМЛХ УЙЗОБМБ ЮЕТЕЪ 5 УЕЛХОД signal.alarm(5)

#ьФБ ПРЕТБГЙС НПЦЕФ РТЙЧЕУФЙ Л ЪБЧЙУБОЙА fd = os.open(’/dev/ttyS0’, os.O_RDWR)

#пФЛМАЮБЕН РПУЩМЛХ УЙЗОБМБ

signal.alarm(0)

21.17socket — сетевой интерфейс низкого уровня

Модуль socket предоставляет низкоуровневый доступ к сетевым соединениям. Этот модуль доступен для всех современных вариантов UNIX, Windows, Macintosh, BeOS, OS/2 и, возможно, для некоторых других платформ.

Адреса для сетевых соединений представляются одной строкой для семейства AF_UNIX и как пара ‘(host, port)’ для семейства AF_INET, где host — строка, содержащая имя узла (например, ’daring.cwi.nl’) или IP адрес (например, ’100.50.200.5’), и port — номер порта. Воспринимаются также две специальные формы IP адресов: пустая строка соответствует INADDR_ANY и строка ’<broadcast>’

соответствует INADDR_BROADCAST.

Поддержка режима без блокировки осуществляется через метод setblocking().

Модуль socket определяет следующие константы и функции:

AF_UNIX AF_INET
Эти

308

Глава 21. Доступ к средствам, предоставляемым операционной . . .

error

Исключения этого класса генерируются в случае возникновения ошибок, связанных с сетевым соединением или адресом. Аргументами исключения являются строка, описывающая причину возникновения ошибки, и, возможно, системный код ошибки (см. описание модуля errno).

(UNIX)

константы используются в качестве первого аргумента конструктора socket() и указывают семейство, к которому относится адрес соединения (UNIXсоединение или соединение с Internet).

SOCK_STREAM

SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET

Эти константы используются в качестве второго аргумента конструктора socket() и указывают тип соединения (обычно используются только первые два типа).

INADDR_* IP_* IPPORT_* IPPROTO_* MSG_* SO_* SOL_*

SOMAXCONN

Множество констант такого вида определено в этом модуле и обычно используются в качестве аргументов методов setsockopt() и getsockopt() объектов, представляющих сетевое соединение. Информацию о них Вы можете получить в документации UNIX по сетевым соединениям и протоколу IP.

getfqdn([name])

Возвращает полное уточненное доменное имя для name. Если аргумент name опущен или является пустой строкой, он считается соответствующим локальному узлу. Для того, чтобы получить полное уточненное имя, проверяется сначала имя узла, возвращаемое функцией gethostbyaddr(), затем псевдонимы, если они имеются. Выбирается первое имя, содержащее точку. В случае, если уточненное имя не доступно, возвращает имя узла. Функция доступна, начиная с версии 2.0.

gethostbyname(hostname)

Возвращает строку, содержащую IP адрес узла с именем hostname. Если строка hostname содержит IP адрес, она возвращается без изменений.

gethostbyname_ex(hostname)

Возвращает кортеж ‘(mainhostname, aliaslist, ipaddrlist)’, где mainhostname — основное имя узла, соответствующего hostname, aliaslist — список (возможно пустой) альтернативных имен для того же

21.17. socket — сетевой интерфейс низкого уровня

309

адреса и ipaddrlist — список IP адресов для того же интерфейса к тому же узлу (обычно содержит одну строку).

gethostname()

Возвращает строку, содержащую имя узла машины, на которой в данный момент выполняется интерпретатор языка Python. Если Вы хотите получить IP адрес текущей машины, используйте gethostbyname(gethostname()). Заметим, что функция gethostname() не всегда возвращает полное имя — для этих целей следует использовать getfqdn(gethostname()).

gethostbyaddr(ip_address)

Возвращает кортеж ‘(hostname, aliaslist, ipaddrlist)’, где hostname — основное имя узла, соответствующего IP адресу ip_address, aliaslist — список (возможно пустой) альтернативных имен для того же адреса и ipaddrlist — список IP адресов для того же интерфейса к тому же узлу (обычно содержит одну строку).

getprotobyname(protocolname)

Возвращает число, подходящее для использования в качестве третьего аргумента функции socket() и соответствующее протоколу с именем protocolname. Это необходимо только, если Вы открываете соединение в “прямом” режиме (SOCK_RAW), для остальных типов соединений правильный протокол выбирается автоматически, если соответствующий аргумент опущен или равен нулю.

getservbyname(servicename, protocolname)

Возвращает номер порта для службы с именем servicename и протоколом с именем protocolname. Имя протокола должно быть равным ’tcp’ или ’udp’.

socket(family, type [, proto])

Создает новое сетевое соединение и возвращает соответствующий ему объект. family — семейство адресов (AF_INET или AF_UNIX), type — тип соединения (одна из констант SOCK_*) и proto — номер протокола. Если аргумент proto опущен, протокол выбирается автоматически.

fromfd(fd, family, type [, proto])

Создает объект сетевого соединения из файлового дескриптора fd и возвращает его. Файловый дескриптор должен соответствовать сетевому соединению (однако это не проверяется — последующие операции могут вызвать ошибку, если дескриптор непригоден). Остальные аргументы имеют такое же значение, как и для функции socket().

ntohl(x)

Преобразует представление 32-битового целого числа с общепринятым в сети порядком следования байтов к представлению с порядком следования байтов на данной машине.

ntohs(x)

Преобразует представление 16-битового целого числа с общепринятым в сети порядком следования байтов к представлению с порядком следования байтов на данной машине.

310

Глава 21. Доступ к средствам, предоставляемым операционной . . .

htonl(x)

Преобразует представление 32-битового целого числа с порядком следования байтов на данной машине к представлению с общепринятым в сети порядком следования байтов.

htons(x)

Преобразует представление 16-битового целого числа с порядком следования байтов на данной машине к представлению с общепринятым в сети порядком следования байтов.

inet_aton(ip_string)

Возвращает строку из четырех символов, содержащую IP адрес ip_string (строка вида ’123.45.67.89’) в упакованном двоичном виде. Эта функция может быть полезна для связи с программой, использующей стандартную библиотеку языка C.

inet_ntoa(packed_ip)

Возвращает строку с IP адресом, полученным распаковкой строки из четырех символов packed_ip, содержащей упакованное двоичное представление адреса.

SocketType

Тип объекта сетевого соединения, возвращаемого функцией socket().

Объекты сетевого соединения, возвращаемые функцией socket(), имеют следующие методы:

accept()

Принимает соединение и возвращает пару ‘(conn, address)’, где conn — новый объект сетевого соединения, подходящий для посылки и получения данных, и address — адрес другого конца сетевого соединения. Объект сетевого соединения, к которому применяется метод accept(), должен быть привязан к адресу (метод bind()) и ожидать соединения (метод listen()).

bind(address)

Привязывает сетевое соединение к адресу address. Перед вызовом этого метода объект не должен быть привязанным к адресу. Формат аргумента зависит от семейства, к которому относится адрес (см. начало раздела).

close()

Закрывает сетевое соединение, после чего все операции над объектом будут вызывать ошибку. Сетевое соединение автоматически закрывается при достижении нуля количества ссылок на объект сетевого соединения.

connect(address)

Подсоединяется к удаленному узлу с адресом address. Формат аргумента зависит от семейства, к которому относится адрес (см. начало раздела).

connect_ex(address)

Работает аналогично методу connect(), но возвращает код ошибки, возвращаемый системной функцией connect() вместо того, чтобы генерировать исключение. Возвращаемое значение равно 0 в случае успешного выполнения операции и