Выбрать главу

Обратите также внимание, что большинство библиотечных функций Python в качестве разделителей элементов путей к каталогам принимают как прямой (/), так и обратный (\) слеш, независимо от используемой платформы. Это значит, что / обычно действует и в Windows, что способствует созданию сценариев, переносимых на Unix. Описываемые далее в этой главе инструменты из модулей os и os.path также способствуют переносимости путей в сценариях.

Таблица загруженных модулей

В модуле sys есть также средства, позволяющие подключиться к интерпретатору. Например, переменная sys.modules служит словарем, содержащим записи вида namemodule для каждого модуля, импортированного в сеанс или программу Python (точнее, в вызывающий процесс Python):

>>> sys.modules

{‘reprlib’: <module ‘reprlib’ from ‘c:\python31\lib\reprlib.py’>,

...часть строк удалена...

>>> list(sys.modules.keys())

[‘reprlib’, ‘heapq’, ‘__future__’, ‘sre_compile’, ‘_collections’, ‘locale’,

‘_sre’, ‘functools’, ‘encodings’, ‘site’, ‘operator’, ‘io’, ‘__main__’, ...часть

строк удалена... ]

>>> sys

<module ‘sys’ (built-in)>

>>> sys.modules['sys']

<module ‘sys’ (built-in)>

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

Аналогичным средством подключения к интерпретатору является счетчик ссылок на объекты, доступный через переменную sys.getrefcount, и список имен модулей, встроенных в выполняемый файл интерпретатора Python (sys.builtin_module_names). Более подробные сведения вы найдете в руководстве по библиотеке Python. Подобные переменные главным образом предназначены для получения внутренней информации интерпретатора Python, но иногда они могут иметь большое значение для программистов, создающих инструменты для других программистов.

Сведения об исключениях

Некоторые атрибуты модуля sys позволяют получить все сведения о самом последнем исключении, возбужденном интерпретатором Python. Это удобно, когда требуется реализовать обобщенную процедуру обработки исключений. Например, функция sys.exc_info возвращает кортеж, содержащий тип последнего исключения, его значение и объект с трассировочной информацией. В модели исключений, которая в Python 3 полностью основана на классах, первые два элемента кортежа соответствуют классу последнего исключения и его экземпляру:

>>> try:

...    raise IndexError

... except:

...    print(sys.exc_info())

(<class ‘IndexError’>, IndexError(), <traceback object at 0x019B8288>)

Эту информацию можно использовать для создания собственного сообщения об ошибке, выводимого в окне диалога графического интерфейса или в веб-странице HTML (напомню, что не обработанные исключения по умолчанию завершают программы с выводом сообщения об ошибке). Первые два элемента кортежа, возвращаемого этой функцией, по умолчанию предусматривают вывод полезной информации, а третий элемент, объект с трассировочной информацией, можно обработать с помощью стандартного модуля traceback:

>>> import traceback, sys >>> def grail(x):

...    raise TypeError('already got    one')

>>> try:

...    grail('arthur')

... except:

...    exc_info = sys.exc_info()

...    print(exc_info[0])

...    print(exc_info[1])

...    traceback.print_tb(exc_info[2])

<class ‘TypeError’> already got one

File "<stdin>", line 2, in <module>

File "<stdin>", line 2, in grail

Модуль traceback может также представлять сообщения в виде строк и записывать их в указанный объект файла - более подробную информацию вы найдете в руководстве по библиотеке Python.

Другие элементы, экспортируемые модулем sys

Модуль sys экспортирует и другие часто используемые инструменты, с которыми мы встретимся в контексте более крупных тем и примеров далее в этой части книги. Например:

•    Аргументы командной строки можно получить в виде списка строк под именем sys.argv

•    Стандартные потоки ввода-вывода доступны в виде sys.stdin, sys. stdout и sys.stderr

•    Завершение программы можно вызвать с помощью функции sys. exit

Однако поскольку все эти инструменты ведут к более крупным темам, о них будет рассказано ниже в отдельных разделах.

Модуль os

Как уже говорилось выше, модуль os - более крупный из двух основных системных модулей. В нем содержатся все обычные вызовы операционной системы, с которыми вы могли ранее встречаться в своих программах на языке C и в сценариях оболочки. Его вызовы имеют дело с каталогами, процессами, переменными оболочки и так далее. Формально этот модуль предоставляет инструментальные средства POSIX - переносимого стандарта вызовов операционной системы - вместе с платформонезависимыми средствами работы с каталогами, к которым относится вложенный модуль os.path. Функционально модуль os играет роль переносимого интерфейса к системным вызовам операционной системы: сценарии, написанные с использованием модулей os и os.path, обычно могут выполняться на любой платформе без внесения изменений. На некоторых платформах модуль os включает дополнительные инструменты, доступные только на этой платформе (например, низкоуровневые операции с процессами в Unix). Однако, в общем и целом, этот модуль является кросс-платформенным, насколько это технически возможно.