Модуль sys на языке Python

Модуль sys предоставляет ряд функций и переменных, которые можно использовать для управления различными частями среды выполнения Python.

Работа с аргументами командной строки

Список argv содержит аргументы, которые были переданы скрипту при запуске интерпретатора, как показано в примере. Первый элемент содержит имя самого скрипта.

Пример№1. Использование модуля sys для получения аргументов скрипта

File: sys-argv-example-1.py
importsys

print»имя скрипта», sys.argv[0]

iflen(sys.argv) > 1:
print»есть», len(sys.argv)-1, «аргументы:»
forargвsys.argv[1:]:
printargelse
:
print»нет никаких аргументов!»

имя скрипта sys-argv-example-1.py
нет никаких аргументов!

Если вы читаете сценарий со стандартного ввода (например, “python< sys-argv-example-1.py”), имя скрипта устанавливается в пустую строку. Если вы передадите программу в виде строки (используя опцию-c), имя скрипта будет установлено на “-c».”

Работа с модулями

Список путей содержит список имен каталогов, в которых Python ищет модули расширения (исходные модули Python, скомпилированные модули или двоичные расширения). При запуске Python этот список инициализируется из смеси встроенных правил, содержимого переменной среды PYTHONPATH и содержимого реестра (в Windows). Но поскольку это обычный список, вы также можете манипулировать им из программы, как показано в примере.

Пример№2. Использование модуля sys для управления путем поиска модуля

File: sys-path-example-1.py

importsys

print»path has», len(sys.path), «members»

# добавьте каталог sample в путь
sys.path.insert(0, «samples»)
importexample

sys.path = []
import random # ой!

Следующий пример демонстрирует список builtin_module_names, который содержит имена всех модулей, встроенных в интерпретатор Python.

Пример№3. Использование модуля sys для поиска встроенных модулей

File: sys-builtin-module-names-example-1.py

importsys

def dump(модуль):
print module, «=>»,
if module in sys.builtin_module_names:
print»<BUILTIN>»
else:
module= _ _import_ _(модуль)
print module._ _ file_ _

dump(«os»)
dump(«sys»)
dump(«string»)
dump(«strop»)
dump(«zlib»)

ос => C:\python\lib\os.pyc
sys =><BUILTIN>
string=> C:\python\lib\string.pyc
strop =><BUILTIN>
zlib => C:\python\zlib.pyd

Словарь модулей содержит все загруженные модули. Оператор import проверяет этот словарь, прежде чем он действительно загружает что-то с диска. Как вы можете видеть из следующего примера , Python загружает довольно много модулей, прежде чем передать управление вашему скрипту.

Пример№4. Использование модуля sys для поиска импортированных модулей

File: sys-modules-example-1.py

importsys

printsys.modules.keys()

[‘os.path’, ‘os’, ‘exceptions’, ‘_ _main_ _’, ‘ntpath’, ‘strop’, ‘nt’,
‘sys’, ‘_ _builtin_ _’, ‘site’, ‘signal’, ‘UserDict’, ‘string’, ‘stat’]

Работа с отсчетами ссылок

Функция getrefcount (показанная в примере №5) возвращает счетчик ссылок для данного объекта—то есть количество мест, где используется эта переменная. Python отслеживает это значение, и когда оно падает до 0, объект уничтожается.

Пример№5. Использование модуля sys для поиска количества ссылок

File: sys-getrefcount-example-1.py

import sys

variable = 1234

printsys.getrefcount(0)
printsys.getrefcount(variable)
printsys.getrefcount(None)

50
3
192

Обратите внимание, что это значение всегда больше, чем фактическое количество, так как функция сама зависает на объекте при определении значения.

Проверка хост — платформы

Пример №6 . Использование модуля sys для поиска текущей платформы

File: sys-platform-example-1.py

Import sys

#
# эмулировать «importos.path» (что-то вроде)…

ifsys.platform == «win32»:
importntpath
pathmodule = ntpath
elifsys.platform == «mac»:
importmacpath
pathmodule = macpath else
:
# предположим, что это posix platform
importposixpath
pathmodule = posixpath

printpathmodule

Типичные названия платформ — win32 для Windows 9X/NT и mac для Macintosh. Для систем Unix название платформы обычно выводится из выходных данных команды “uname-r”, таких как irix6, linux2 или sunos5 (Solaris).

Трассировка программы

Функция setprofiler позволяет установить функцию профилирования. Это вызывается каждый раз, когда вызывается функция или метод, при каждом возврате (явном или подразумеваемом) и для каждого исключения. Давайте рассмотрим пример №7.

Пример №7. Использование модуля sys для установки функции профилировщика

File: sys-setprofiler-example-1.py

importsys

testdef(n):
j = 0
fori in range (n):
j = j + i
returnn

def profiler(frame, event, arg):
print event, frame.f_code.co_name, frame.f_lineno, «->», arg

# profiler активируется при следующем вызове, возврате или исключении
sys.setprofile(profiler)

# профиль тест вызова этой функции
test(1)

# отключить профилировщик
sys.setprofile(None)

# не профилируйте этот
test(2)

call test 3 ->None
return test 7 -> 1

Модуль профиля предоставляет полную структуру профилировщика, основанную на этой функции. Функция settrace в примере №8 аналогична, но функция trace вызывается для каждой новой строки.

Пример №8. Использование модуля sys для установки функции трассировки

File: sys-settrace-example-1.py

importsys

testdef(n):
j = 0
for i in range (n):
j = j + i
returnn

def tracer(frame, event, arg):
print event, frame.f_code.co_name, frame.f_lineno, «->», arg
returntracer

# tracer активируется при следующем вызове, возврате или исключении
sys.settrace(tracer)

# trace this function call
test(1)

# отключить трассировку
sys.settrace(None)

# не отслеживайте этот
test(2)

вызовите тест 3 -> None
line test 3 -> None
line test 4 -> None
line test 5 -> None
line test 5 -> None
line test 6 -> None
line test 5 -> None
line test 7 -> None
return test 7 -> 1

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

Работа со стандартными входами и выходами

Переменные stdin, stdout и stderr содержат потоковые объекты, соответствующие стандартным потокам ввода-вывода. Вы можете получить к ним прямой доступ, если вам нужен лучший контроль над выводом, чем может дать вам печать. Вы также можете заменить их, если хотите перенаправить вывод и ввод на какое-то другое устройство или обработать их каким-то нестандартным способом, как показано в примере №9.

Пример №9. Использование модуля sys для перенаправления вывода

File: sys-stdout-example-1.py

import sys
import string

перенаправление класса:

def _ _init_ _(self, stdout):
self.stdout = stdout

def write(self, s):
self.stdout.write(string.lower(s))

# перенаправление стандартного вывода (включая инструкцию print)
old_stdout = sys.stdout
sys.stdout= Redirect(sys.stdout)

print «HEJA SVERIGE»,
print «FRISKT HUM\303\226R»

# восстановить стандартный вывод
sys.stdout = old_stdout

print «M\303\205\303\205\303\205\303\205Л!»

hejasverigefriskthum\303\266r
М\303\205\303\205\303\205\303\205Л!

Объект, реализующий метод write — это все, что требуется для перенаправления вывода.

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

Выход из программы

Когда вы дойдете до конца основной программы, интерпретатор автоматически завершится. Если вам нужно выйти в полете, вы можете вызвать функцию sys.exit, которая принимает необязательное целочисленное значение, возвращаемое вызывающей программе. Это показано в примере №10.

Пример №10. Использование модуля sys для выхода из программы

File: sys-exit-example-1.py

Import sys

print»привет»

sys.exit(1)

print «там»

привет

Это может быть не очевидно, но sys.exit не выходит сразу. Вместо этого он вызывает исключение SystemExit. Это означает, что вы можете перехватывать вызовы sys.exit в своей основной программе, как показано в примере №11.

Пример №11. Перехват вызова sys.exit

File: sys-exit-example-2.py

Import sys

print»привет»
sys.exit(1)
exceptSystemExit:
проходить
print «там»

привет

Если вы хотите очистить вещи после себя, вы можете установить “обработчик выхода”, который является функцией, которая автоматически вызывается на выходе. Это показано в примере №12.

Пример №12. Перехват вызова sys.exit Другим Способом

File: sys-exitfunc-example-1.py

importsys
defexitfunc():
print»Мир»
sys.exitfunc = exitfunc
print «привет»
sys.exit(1)
print «там» # никогда не напечатается

мир

В Python 2.0 вы можете использовать модуль atexit для регистрации нескольких обработчиков выхода.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *