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

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

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

21.7. time — определение и обработка времени

 

 

291

 

 

 

 

 

 

Индекс

Назначение поля

 

Диапазон значений

 

 

 

 

 

 

5

секунда

0–61; значения 60 и 61 использу-

 

 

 

 

ются изредка для согласования с

 

 

 

солнечным календарем

6

день недели

0–6;

0

соответствует

 

 

 

понедельнику

 

 

7юлианское представление даты 1–366 (числом дней от начала года)

8

флаг коррекции летнего времени 0, 1 или -1; смотрите ниже

 

 

Обратите внимание, что в отличие от аналогичной структуры в языке C, значения месяцев находится в диапазоне 1–12, а не 0–11. Значение года обрабатывается так, как описано выше. Флаг коррекции для летнего времени равный -1, как правило, приводит к автоматическому выбору правильного состояния.

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

accept2dyear

Если эта переменная не равна нулю, допускается использование представления года двумя цифрами. По умолчанию эта переменная равна 1, однако, если переменная окружения PYTHONY2K установлена и равна непустой строке, accept2dyear инициализируется нулем. Таким образом, Вы можете запретить использование только двух цифр, установив переменную окружения PYTHONY2K равной непустой строке. Вы можете также менять значение accept2dyear во время выполнения программы.

altzone()

Сдвиг локального часового пояса с учетом перехода на летнее время в секундах на запад от UTC. Это значение всегда отрицательно, если часовой пояс находится восточнее UTC (в том числе и Россия). Используйте эту функцию, только если значение переменной daylight не равно нулю.

asctime(time_tuple)

Преобразует кортеж time_tuple, представляющий время (возвращается функциями gmtime(), localtime() и strptime()), в строку из 24 символов вида ’Sun Jun 20 23:21:05 1993’. Обратите внимание, что в отличие от одноименной функции языка C, строка не завершается символом перехода на новую строку.

clock()

Возвращает текущее процессорное время в секундах в виде вещественного числа. Точность возвращаемого времени зависит от точности одноименной функции библиотеки языка C. Функция clock() может быть использована, например, для замера производительности.

ctime(secs)

Преобразует время secs, выраженное в секундах с начала эпохи в строку, представляющую локальное время. Эквивалентно asctime(localtime(secs)).

292

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

daylight

Эта переменная имеет ненулевое значение, если определен часовой пояс с переходом на летнее время (DST).

gmtime(secs)

Преобразует время secs, выраженное в секундах с начала эпохи в кортеж, представляющий универсальное время (UTC).

localtime(secs)

Преобразует время secs, выраженное в секундах с начала эпохи в кортеж, представляющий локальное время. Флаг коррекции времени равен 1 (последний элемент), если применяется переход на летнее время (DST).

mktime(time_tuple)

Эта функция выполняет преобразование, обратное функции localtime(). Аргумент time_tuple должен быть кортежем из 9 элементов, представляющим локальное время. Для совместимости с функцией time() возвращает вещественное число. Если time_tuple не представляет корректного времени, генерирует исключение OverflowError.

sleep(secs)

Приостанавливает выполнение на secs секунд. Аргумент secs может быть вещественным числом для указания более точного времени. Реальное время, на которое приостанавливается выполнение программы, может быть меньше secs, так как любой перехваченный сигнал прерывает выполнение функции sleep(), после чего выполняется обработчик сигнала. Кроме того, время может быть и больше secs из-за планирования активности различных задач системы.

strftime(format, time_tuple)

Возвращает время, выраженное кортежем time_tuple, в виде строки в соответствии с форматом format. Строка формата помимо обычных символов может содержать следующие управляющие последовательности (названия месяцев, дней недели и т. п. зависят от текущих национальных установок — см. описание модуля locale):

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

Назначение

%a

Сокращенное название дня недели.

%A

Полное название дня недели.

%b

Сокращенное название месяца.

%B

Полное название месяца.

%c

Общепринятое (в соответствии с текущими националь-

 

ными установками) представление даты и времени.

%d

Десятичное представление числа (дня месяца), ’01’

 

’31’.

%H

Десятичное представление часа, ’00’’23’.

%I

Десятичное представление часа, ’01’’12’.

 

 

21.7. time — определение и обработка времени

293

 

 

 

 

 

 

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

Назначение

 

 

 

 

 

 

 

 

%j

Десятичное представление дня года, ’001’’366’.

 

 

 

%m

Десятичное представление месяца, ’01’’12’.

 

 

 

%M

Десятичное представление минут, ’01’’59’.

 

 

 

%p

Национальный эквивалент обозначения ‘AM’ (до полу-

 

 

 

 

дня) или ‘PM’ (после полудня).

 

 

 

%S

Десятичное представление секунд, ’00’’61’. Значе-

 

 

 

 

ния 60 и 61 используются изредка для согласования с

 

 

 

 

солнечным календарем.

 

 

 

%U

Десятичное представление порядкового номера недели

 

 

 

 

года, ’00’’53’. Считается, что неделя начинается с

 

 

 

 

воскресенья, все дни в новом году до первого воскре-

 

 

 

 

сенья относятся к неделе с номером 0.

 

 

 

%w

Десятичное представление дня недели, ’0’’6’ (’0’

 

 

 

 

соответствует воскресенью).

 

 

 

%W

Десятичное представление порядкового номера недели

 

 

 

 

года, ’00’’53’. Считается, что неделя начинается с

 

 

 

 

понедельника, все дни в новом году до первого поне-

 

 

 

 

дельника относятся к неделе с номером 0.

 

 

 

%x

Общепринятое (в соответствии с текущими националь-

 

 

 

 

ными установками) представление даты.

 

 

 

%X

Общепринятое (в соответствии с текущими националь-

 

 

 

 

ными установками) представление времени.

 

 

 

%y

Представление года без указания века (двумя десятич-

 

 

 

 

ными цифрами), ’00’’99’.

 

 

 

%Y

Полное десятичное представление года (четырьмя

 

 

 

 

цифрами).

 

 

 

%Z

Название часового пояса (или пустая строка, если ча-

 

 

 

 

совой пояс не задан).

 

 

%%

Буква ‘%’.

 

 

 

 

 

 

 

Некоторые платформы могут поддерживать дополнительные управляющие последовательности и позволяют указать ширину поля.

strptime(string [, format])

(большинство современных вариантов UNIX) Разбирает строковое представление времени string в соответствии с форматом format и возвращает кортеж с числами, описанный выше. В аргументе format должны использоваться такие же управляющие последовательности, как и в строке формата функции strftime(). По умолчанию format равен строке ’%a %b %d %H:%M:%S %Y’, соответствующей формату, используемому функцией ctime(). Если строка string не соответствует формату format, генерируется исключение

ValueError.

294

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

time()

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

timezone

Сдвиг локального часового пояса (без учета перехода на летнее время) в секундах на запад от UTC (то есть положительное в США, равное нулю в Великобритании и отрицательное в России).

tzname

Возвращает кортеж из двух строк: первая является названием локального часового пояса без учета перехода на летнее время и вторая — с учетом перехода на летнее время (если таковой не определен, эта строка не должна быть использована).

21.8sched — планирование задач

Модуль sched определяет класс, позволяющий планировать запуск задач:

scheduler(timefunc, delayfunc)

Возвращает объект, являющийся планировщиком задач общего назначения. Аргументы — функции, взаимодействующие с внешним миром. Функция timefunc вызывается без аргументов и должна возвращать число (время, в любых единицах). Функция delayfunc вызывается с одним аргументом — временем (в тех же единицах, которые использует функция timefunc), должна осуществлять приостановку выполнения на указанное время. Кроме того, чтобы дать возможность выполняться другим потокам в многопоточных приложениях, после выполнения каждой задачи функция timefunc вызывается с аргументом 0.

Экземпляры класса scheduler имеют следующие методы:

enterabs(time, priority, action, arguments)

Планирует выполнение новой задачи в указанное время. Аргумент time должен быть числом, выражающим время в тех же единицах, которые использует функция timefunc. В указанное время будет вызвана функция action с аргументами arguments (кортеж). Задачи, запланированные на одно и то же время, будут выполняться в порядке их приоритетов (аргумент priority).

Метод возвращает объект, представляющий запланированную задачу, который может быть использован для ее снятия с помощью метода cancel(), описанного ниже.

enter(delay, priority, action, arguments)

Планирует выполнение новой задачи через указанное время. Аргумент delay

21.9. getpass — запрос пароля и определение имени пользователя

295

должен быть числом, выражающим время в тех же единицах, которые использует функция timefunc, по прошествии которого должна быть запущена задача. Остальные аргументы и возвращаемое значение имеют такое же значение, как и для метода enterabs().

cancel(task)

Удаляет задачу из очереди. Если в очереди отсутствует задача task, генерирует исключение RuntimeError.

empty()

Возвращает 1, если очередь пуста, иначе возвращает 0.

run()

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

Исключения, сгенерированные функциями timefunc, delayfunc и action не обрабатываются. Если исключение сгенерировала функция action, планировщик не будет пытаться выполнить эту задачу при последующих вызовах метода run().

Приведем простой пример:

>>>import sched, time

>>>s=sched.scheduler(time.time, time.sleep)

>>>def print_time():

... print "ч ЖХОЛГЙЙ print_time:", time.time()

...

>>> def print_some_times():

... print time.time()

... s.enter(5, 1, print_time, ())

... s.enter(10, 1, print_time, ())

... s.run()

... print time.time()

...

>>> print_some_times() 930343690.257

÷ЖХОЛГЙЙ print_time: 930343695.274

÷ЖХОЛГЙЙ print_time: 930343700.273 930343700.276

21.9getpass — запрос пароля и определение имени пользователя

Модуль getpass определяет две функции:

296

Глава 21.

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

getpass([prompt])

(UNIX, Windows, Macintosh)

Запрашивает

пароль у

пользователя без отображения вводимых символов.

В качестве приглашения используется строка prompt (по умолчанию равна

’Password: ’).

 

getuser()

 

(UNIX, Windows)

Возвращает регистрационное имя пользователя. Эта функция последовательно проверяет переменные окружения LOGNAME, USER, LNAME и USERNAME и возвращает значение первой переменной, имеющей непустое значение. Если ни одна из этих переменных не установлена, используется модуль pwd там, где он доступен (в противном случае генерируется исключение ImportError).

21.10getopt — обработка опций в командной строке

Модуль getopt помогает обрабатывать аргументы, переданные программе в командной строке (sys.argv). Функция getopt() модуля использует такие же правила, как и одноименная функция языка C в UNIX, включая специальное значение аргументов ‘- ’ и ‘--’. Длинная запись опций, аналогичных тем, которые используются программами GNU, также может быть использована, если задан третий аргумент функции getopt().

getopt(args, options [, long_options])

Обрабатывает список аргументов args (обычно sys.argv[1:]).

Аргумент options должен быть строкой из букв, которые будут распознаваться как опции. Если опция требует наличия аргумента, после соответствующей буквы в строке options должно следовать двоеточие (‘:’).

Если задан аргумент long_options, он должен быть списком строк с именами опций, которые будут распознаваться в виде длинной записи, без приставки ‘- -’. После имени опций, требующих аргумента, в строке должен следовать знак равенства (‘=’).

Функция возвращает кортеж из двух элементов: первый является списком пар ‘(option, value)’ (имя опции и соответствующее ей значение) и список аргументов, оставшихся необработанными (концевой срез последовательности args). Строки option в списке пар начинаются с одного дефиса для опций с короткой записью и с двух дефисов для опций с длинной записью. value является аргументом соответствующей опции или пустой строкой, если опция не имеет аргумента. Опции в списке следуют в том же порядке, в котором они следовали в args. Допускается смешение короткой и длинной записи опций.

GetoptError

error

Исключения этого класса генерируются, если в списке аргументов найдена нераспознанная опция или опция, требующая аргумента, записана без него. Исключение

21.10. getopt — обработка опций в командной строке

297

также будет сгенерировано, если при использовании длинной записи задан аргумент для опции, которая его не требует. Исключения класса GetoptError имеют следующие атрибуты:

msg

Сообщение об ошибке.

opt

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

Имя GetoptError появилось в версии 1.6. Для совместимости с более старыми версиями присутствует имя error, ссылающееся на GetoptError.

Приведем небольшой пример, использующий только короткую запись опций:

>>>import getopt

>>>args = ’-a -b -cfoo -d bar a1 a2’.split()

>>>args

[’-a’, ’-b’, ’-cfoo’, ’-d’, ’bar’, ’a1’, ’a2’]

>>>optlist, args = getopt.getopt(args, ’abc:d:’)

>>>optlist

[(’-a’, ’’), (’-b’, ’’), (’-c’, ’foo’), (’-d’, ’bar’)]

>>> args [’a1’, ’a2’]

Использовать длинную запись опций так же просто:

>>>s = ’--condition=foo --testing --output-file

... abc.def -x a1 a2’

>>>args = s.split()

>>>args

[’--condition=foo’, ’--testing’, ’--output-file’, ’abc.def’, ’-x’, ’a1’, ’a2’]

>>>optlist, args = getopt.getopt(args, ’x’, [

... ’condition=’, ’output-file=’, ’testing’])

>>>optlist

[(’--condition’, ’foo’), (’--testing’, ’’), (’--output-file’, ’abc.def’), (’-x’, ’’)]

>>> args [’a1’, ’a2’]

В реальной программе модуль getopt используется обычно примерно следующим образом:

import getopt, sys

298

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

USAGE = """\

...

"""

def main(): try:

opts, args = getopt.getopt(sys.argv[1:], ’ho:’,

[’help’, ’output=’])

except getopt.GetoptError:

# ЧЩЧПДЙН РПДУЛБЪЛХ Й ЧЩИПДЙН: print << sys.stderr, USAGE sys.exit(2)

output = None

for o, a in opts:

if o in (’-h’, ’--help’): print USAGE sys.exit()

if o in (’-o’, ’--output’): output = a

# ...

if __name__ == ’__main__’: main()

21.11 tempfile — создание временных файлов

Этот модуль предоставляет переносимый способ генерации уникальных имен для временных файлов и их создания:

mktemp([suffix])

Возвращает уникальное имя временного файла. Это абсолютный путь файла, который в момент вызова функции не существует. При последующих вызовах функция mktemp() никогда не вернет такое же имя. Если задан аргумент suffix, он будет использоваться в качестве последней части (суффикса) имени файла.

TemporaryFile([mode [, bufsize [, suffix]]])

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

Аргумент mode указывает режим, в котором файл будет открыт. По умолчанию он равен ’w+b’, что позволяет как записывать, так и читать из файла не закрывая

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

299

его. Аргумент bufsize имеет такое же значение, как и во встроенной функции open(). Если задан аргумент suffix, он будет использоваться в качестве последней части (суффикса) имени файла.

gettempprefix()

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

Модуль определяет следующие глобальные переменные, определяющие, каким образом будет конструироваться имя временного файла. Заметим, что присваивание им нового значения невозможно, если Вы использовали инструкцию вида ‘from tempfile import ...’ для импортирования модуля.

tempdir

Если эта переменная имеет значение отличное от None, определяет имя каталога, в котором будут создаваться временные файлы. Инициализируется при первом вызове функции mktemp(). Значение по умолчанию берется из переменной окружения TMPDIR, TEMP или TMP. Если ни одна из этих переменных не установлена, используется общепринятая для данной платформы (‘/var/tmp’, ‘/usr/tmp’ или ‘/tmp’ в UNIX) или текущий каталог.

template

Если эта переменная имеет значение, отличное от None, определяет приставку к именам временных файлов. Инициализируется при первом вызове функции mktemp(). По умолчанию используется ’@pid.’ в UNIX, ’~pid-’ в Windows NT, ’Python-Tmp-’ в Macintosh и ’tmp’ на других платформах.

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

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

errorcode

Словарь, отображающий код ошибки к его имени в данной системе. Например, выражение errorcode[EPERM] дает ’EPERM’.

Для получения сообщения об ошибке, соответствующего ее коду, используйте функцию os.strerror().

Ниже перечислены основные символические константы (в соответствии со стандартами POSIX.1, ISO C). Из этого списка модуль определяет только те константы, которые используются на данной платформе (Вы можете получить полный список имен доступных констант как результат выражения errno.errorcode.values()):

300

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

EPERM

Недопустимая операция.

ENOENT

Нет такого файла или каталога.

ESRCH

Нет такого процесса.

EINTR

Прерван системный вызов.

EIO

Ошибка ввода/вывода.

ENXIO

Нет такого устройства или адреса.

E2BIG

Слишком длинный список аргументов.

ENOEXEC

Неверный формат аргументов системного вызова exec().

EBADF

Неверный дескриптор файла.

ECHILD

Нет дочернего процесса.

EAGAIN

Ресурс временно недоступен.

ENOMEM

Не хватает памяти.

EACCES

Доступ запрещен.

EFAULT

Неверный адрес.

EBUSY

Устройство или ресурс занят.

EEXIST

Файл уже существует.

EXDEV

Неверная ссылка (на файл, находящийся на другом устройстве).

ENODEV

Нет такого устройства.