справочник по Python. мм isbn 9785932861578 9 785932 861578
Скачать 4.21 Mb.
|
Глава 19 . Службы операционной системы М одули, о которых рассказывается в этой главе, предоставляют доступ к самым разнообразным службам операционной системы, с особым акцен- том на низкоуровневые операции ввода-вывода, управление процессами и рабочим окружением. Здесь также рассказывается о модулях, которые обычно используются при разработке системного программного обеспе- чения, например здесь будут представлены модули, позволяющие читать содержимое файлов с настройками, выполнять запись в файлы журналов и так далее. В главе 18 «Работа с файлами и каталогами» рассказывается о модулях, реализующих высокоуровневые операции над файлами и ка- талогами. Сведения, представленные здесь, относятся к операциям более низкого уровня. Большинство модулей Python, предназначенных для организации взаи- Python, предназначенных для организации взаи- , предназначенных для организации взаи- модействий с операционной системой, основаны на интерфейсах POSIX. POSIX – это стандарт, который определяет базовый набор интерфейсов операционных систем. Большинство версий UNIX поддерживают стан- UNIX поддерживают стан- поддерживают стан- дарт POSIX, а другие системы, такие как Windows, поддерживают значи- тельную долю этих интерфейсов. На протяжении всей главы особо будут отмечаться функции и модули, которые могут использоваться только на определенной платформе. Под системами UNIX здесь также подразумева- UNIX здесь также подразумева- здесь также подразумева- ются Linux и Mac OS X. Под Windows подразумеваются все версии Win- Windows подразумеваются все версии Win- подразумеваются все версии Win- Win- dows, если явно не оговаривается иное. Читателям может потребоваться получить справочную информацию, до- полняющую сведения, которые приводятся здесь. Отличный обзор файлов, дескрипторов файлов и низкоуровневых интерфейсов, на которых основа- ны многие модули, рассматриваемые в этом разделе, можно найти во вто- ром издании книги «The C Programming Language» Брайана У. Кернигана (Brian W. Kernighan) и Денниса М. Ричи (Dennis M. Ritchie) (Prentice Hall, 1989). 1 Более опытным читателям можно порекомендовать второе издание 1 Керниган Б., Ричи Д. «Язык программирования C», 2-е издание. – Пер. с англ. – Вильямс, 2008. 416 Глава 19. Службы операционной системы книги «Advanced Programming in the UNIX Environment» Ричарда У. Сти- венса (W. Richard Stevens) и Стивена Раго (Stephen Rago) (Addison Wesley, 2005). 1 Краткий обзор общих понятий можно найти в учебнике по операци- онным системам. Однако, учитывая высокую стоимость и ограниченную практическую ценность этих книг, лучше будет, пожалуй, попросить их на выходные у знакомого студента, изучающего информационные техно- логии. Модуль commands Модуль commands применяется для выполнения простых системных ко- манд, передавая их в виде строки и получая результаты их работы также в виде строки. Этот модуль может использоваться только в системах UNIX. Функциональные возможности, предоставляемые этим модулем, напоми- нают действие обратных апострофов (`) в сценариях командной оболочки UNIX. Например, инструкция x = commands.getoutput(‘ls –l’) похожа на ко- манду x=`ls –l`. getoutput(cmd) Выполняет команду cmd в командной оболочке и возвращает строку, содер- жащую потоки стандартного вывода и стандартного вывода сообщений об ошибках команды. getstatusoutput(cmd) Похожа на функцию getoutput() за исключением того, что возвращает кор- теж из двух элементов (status, output), где поле status содержит код завер- шения, возвращаемый функцией os.wait(), а поле output – строку, которую возвращает getoutput(). Примечания Этот модуль доступен только в Python 2. В Python 3 обе упомянутые функ- ции находятся в модуле subprocess. Хотя этот модуль и может использоваться для выполнения простых команд командной оболочки, тем не менее практически всегда лучше использовать модуль subprocess, позволяющий запускать дочерние процессы и получать их вывод. См. также Описание модуля subprocess (стр. 503). Модули ConfigParser и configparser Модуль ConfigParser (в Python 3 он называется configparser) используется для чтения файлов с настройками в формате файлов Windows INI. Эти 1 Стивенс У., Раго С. «UNIX. Профессиональное программирование», 2-е изда- ние. – Пер. с англ. – СПб.: Символ-Плюс, 2007. Модули ConfigParser и configparser 417 файлы состоят из именованных разделов, в каждом из которых перечисле- ны собственные переменные с их значениями, как показано ниже: # Комментарий ; Комментарий [ section1] name1 = value1 name2 = value2 ёё [ section2] ; Альтернативный синтаксис присваивания значений name1: value1 name2: value2 ... Класс ConfigParser Класс ConfigParser используется для работы с параметрами настройки: ConfigParser([ defaults [, dict_type]]) Создает новый экземпляр класса ConfigParser. В аргументе defaults мож- но передать необязательный словарь значений, на которые допускается ссылаться в параметрах настройки с помощью спецификаторов формата, таких как ‘%(key)s’, где key – ключ в словаре defaults. Аргумент dict_type определяет тип словаря, который будет использоваться внутренней реали- зацией для хранения параметров настройки. По умолчанию используется тип dict (встроенный словарь). Экземпляр c класса ConfigParser обладает следующими методами: c.add_section(section) Добавляет новый раздел для хранения параметров настройки. В аргументе section передается строка с именем раздела. c.defaults() Возвращает словарь со значениями по умолчанию. c.get(section, option [, raw [, vars]]) Возвращает значение параметра option из раздела section в виде строки. По умолчанию возвращаемая строка проходит этап интерпретации, где выполняется подстановка фактического значения в строку формата, та- кую как ‘%(option)s’. В данном случае option может быть именем другого параметра настройки в том же разделе или одним из значений по умолча- нию, переданных функции ConfigParser в аргументе defaults. В аргументе raw передается логический флаг, запрещающий интерпретацию, и в этом случае значение параметра option возвращается в первоначальном виде. В необязательном аргументе vars передается словарь с дополнительными значениями для использования оператором форматирования ‘%’. c.getboolean(section, option) Возвращает значение параметра option из раздела section, преобразованное в логическое значение. Метод распознает такие значения, как “0”, “true”, 418 Глава 19. Службы операционной системы “yes” , “no”, “on” и “off”, без учета регистра символов. Этот метод всегда вы- полняет интерпретацию параметров (смотрите c.get()). c.getfloat(section, option) Возвращает значение параметра option из раздела section, преобразованное в число с плавающей точкой, с промежуточной интерпретацией значения параметра. c.getint(section, option) Возвращает значение параметра option из раздела section, преобразованное в целое число, с промежуточной интерпретацией значения параметра. c.has_option(section, option) Возвращает True, если раздел section содержит параметр с именем option. c.has_section(section) Возвращает True, если существует раздел с именем section. c.items(section [, raw [, vars]]) Возвращает список пар (option, value) из раздела section. В аргументе raw передается логический флаг, запрещающий интерпретацию, если он имеет значение True. В аргументе vars передается словарь с дополнительными зна- передается словарь с дополнительными зна- словарь с дополнительными зна- словарь с дополнительными зна- с дополнительными зна- с дополнительными зна- дополнительными зна- дополнительными зна- зна- зна- чениями для использования оператором форматирования ‘%’. c.options(section) Возвращает список всех параметров в разделе section. c.optionxform(option) Преобразует имя параметра option в строку, которая может использоваться для ссылки на параметр. По умолчанию приводит все символы к нижнему регистру. c.read(filenames) Читает параметры настройки из списка filenames и сохраняет их. Аргумент filenames может быть единственной строкой, и тогда он будет интерпрети- роваться как имя файла, который требуется прочитать, либо список имен файлов. Если какой-либо из указанных файлов не будет найден, он будет просто проигнорирован. Этот метод удобно использовать для чтения фай- лов с настройками из нескольких возможных местоположений, где такие файлы могут присутствовать или отсутствовать. Возвращает список имен успешно прочитанных файлов. c.readfp(fp [, filename]) Читает параметры настройки из объекта fp, похожего на объект файла, ко- торый уже должен быть открыт. Аргумент filename определяет имя файла, ассоциированное с объектом fp (если необходимо). По умолчанию имя фай- ла извлекается из атрибута fp.name или принимает значение ‘??>’, если этот атрибут не определен. c.remove_option(section, option) Удаляет параметр option из раздела section. Модули ConfigParser и configparser 419 c.remove_section(section) У даляет раздел section. c.sections() Возвращает список имен всех разделов. c.set(section, option, value) Устанавливает параметр настройки option, из раздела section, в значение value . Значение value должно быть строкой. c.write(file) Записывает все параметры настройки, хранящиеся в текущий момент, в файл file. Аргумент file должен быть уже открытым объектом, похожим на объект файла. Пример Модуль ConfigParser часто упускается из виду, но это чрезвычайно полез- ный инструмент, позволяющий управлять программами со сложными пользовательскими настройками или окружением времени выполнения. Например, когда пишется компонент, который будет работать внутри бо- лее крупного приложения, файл с настройками зачастую является един- ственным элегантным способом передать ему параметры времени выпол- нения. Точно так же файл с параметрами настройки может оказаться бо- лее элегантным способом, чем передача огромного количества параметров в командной строке и чтение их с помощью модуля optparse. Существуют также тонкие, но значимые отличия между использованием файлов с на- стройками и чтением параметров из сценария на языке Python. Ниже приводятся несколько примеров, иллюстрирующих некоторые из наиболее интересных особенностей модуля ConfigParser. Для начала взгля- начала взгля- начала взгля- взгля- взгля- ните на пример файла .ini: # appconfig.ini # Файл с параметрами настройки приложения mondo ёё [output] LOGFILE=%(LOGDIR)s/app.log LOGGING=on LOGDIR=%(BASEDIR)s/logs ёё [input] INFILE=%(INDIR)s/initial.dat INDIR=%(BASEDIR)s/input Следующий фрагмент программного кода демонстрирует, как читать со- держимое файла с параметрами и назначать значения по умолчанию не- которым переменным: from configparser import ConfigParser # Use from ConfigParser in Python 2 ёё # Словарь со значениями по умолчанию defaults = { ‘basedir’ : ‘/Users/beazley/app’ 420 Глава 19. Службы операционной системы } ёё # Создать объект ConfigParser и прочитать файл .ini cfg = ConfigParser(defaults) cfg.read(‘appconfig.ini’) После того как файл будет прочитан, значения параметров можно полу- чать с помощью метода get(). Например: >>> cfg.get(‘output’,’logfile’) ‘/Users/beazley/app/logs/app.log’ >>> cfg.get(‘input’,’infile’) ‘/Users/beazley/app/input/initial.dat’ >>> cfg.getboolean(‘output’,’logging’) True >>> Здесь сразу бросаются в глаза некоторые интересные особенности. Во- первых, имена параметров нечувствительны к регистру символов. То есть, если программа читает параметр с именем ‘logfile’, не имеет никакого зна- чения, как он будет называться в файле с настройками, – ‘logfile’, ‘LOGFILE’ или ‘LogFile’. Во-вторых, параметры настройки могут ссылаться на другие параметры, например ‘%(BASEDIR)s’ и ‘%(LOGDIR)s’, присутствующие в фай- ле. В данном случае имена параметров также нечувствительны к регистру символов. Кроме того, в случае использования ссылок на переменные, по- рядок их определения не имеет значения. Например, параметр LOGFILE, в файле appconfig.ini, ссылается на параметр LOGDIR, который определяется ниже. Наконец, значения в файлах параметров часто интерпретируются правильно, даже если они не совсем точно соответствуют синтаксису язы- ка Python или типам данных. Например, значение ‘on’ для параметра LOG- GING интерпретируется методом cfg.getboolean(), как True. Помимо этого, имеется возможность объединять файлы параметров. На- пример, допустим, что у пользователя имеется собственный файл с его на- стройками: ; userconfig.ini ; ; Настройки пользователя ёё [output] logging=off ёё [input] BASEDIR=/tmp Имеется возможность объединить содержимое этого файла с уже загру- женными параметрами настройки. Например: >>> cfg.read(‘userconfig.ini’) [‘userconfig.ini’] >>> cfg.get(‘output’,’logfile’) ‘/Users/beazley/app/logs/app.log’ >>> cfg.get(‘output’,’logging’) ‘off’ Модуль datetime 421 >>> cfg.get(‘input’,’infile’) ‘/tmp/input/initial.dat’ >>> Здесь видно, что вновь загруженные параметры выборочно заменили пара- метры, которые были загружены ранее. Кроме того, если изменить один из параметров настройки, который используется в других параметрах, дей- ствие этих изменений распространится и на другие параметры. Например, ввод нового значения параметра BASEDIR в разделе input отразится на пара- метрах настройки в этом разделе, которые были определены ранее, такие как INFILE. Такое поведение является важным, хотя и малозаметным от- личием между использованием файлов с настройками и определением на- строек программы в сценарии на языке Python. Примечания Вместо класса ConfigParser можно использовать два других класса. Класс RawConfigParser предоставляет аналогичные возможности, что и класс Con- figParser , но он не позволяет использовать ссылки на параметры. Класс Safe- ConfigParser также предоставляет аналогичные возможности, что и класс ConfigParser , но он позволяет решить проблему, когда значения параметров настройки включают в себя литералы специальных символов форматиро- вания, используемые механизмом интерпретации (например, ‘%’). Модуль datetime Модуль datetime объявляет различные классы для представления и рабо- ты с датой и временем. Значительные части этого модуля просто связа- ны с различными способами создания и манипулирования информацией о дате и времени. В число других важных особенностей входят математиче- ские операции, такие как сравнивание и вычисление разницы во времени. Работа с датами является сложным аспектом программирования, поэтому я настоятельно рекомендую читателям ознакомиться с электронной доку- ментацией Python, чтобы получить представление об организации этого модуля. Объекты класса date Объект класса date используется для представления простых дат и содер- жит атрибуты year, month и day. Следующие четыре функции позволяют соз- давать объекты типа date: date(year, month, day) Создает новый объект типа date. В аргументе year передается целое число в диапазоне от datetime.MINYEAR до datetime.MAXYEAR. В аргументе month пере- дается целое число в диапазоне от 1 до 12, а в аргументе day – целое число в диапазоне от 1 до последнего числа указанного месяца month. Возвращает неизменяемый объект date, обладающий атрибутами year, month и day, в ко- торых сохраняются значения соответствующих аргументов. 422 Глава 19. Службы операционной системы date.today() Ме тод класса, который возвращает объект date, соответствующий текущей дате. date.fromtimestamp(timestamp) Метод класса, который возвращает объект date, соответствующий отметке времени timestamp. В аргументе timestamp передается значение, возвращае- передается значение, возвращае- значение, возвращае- значение, возвращае- , возвращае- возвращае- мое функцией time.time(). date.fromordinal(ordinal) Метод класса, который возвращает объект date, соответствующий дате, от- стоящей на ordinal дней от минимально допустимой даты (дата 1 января 1 года имеет порядковый номер 1, а 1 января 2006 года имеет порядковый номер 732312). Следующие атрибуты класса описывают минимальное и максимальное значения дат, а также разрешающую способность экземпляров класса date. date.min Атрибут класса, представляющий минимально допустимую дату (datetime. date(1,1,1) ). date.max Атрибут класса, представляющий максимально допустимую дату (date- time.date(9999,12,31) ). date.resolution Наименьшая различимая разница между двумя неравными объектами date (datetime.timedelta(1)). Экземпляр d класса date обладает атрибутами d.year, d.month и d.day, доступ- ными только для чтения, и дополнительно предоставляет следующие ме- тоды: |