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

Аргументы командной строки

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

>>> import sys

>>> sys.argv

[‘’]

Чтобы действительно увидеть аргументы, нужно запустить сценарий из командной строки. В примере 3.1 приводится простой до безобразия сценарий, который всего лишь выводит список argv для изучения.

Пример 3.1. PP4E\System\testargv.py

import sys

print(sys.argv)

Если запустить этот сценарий, он выведет список аргументов командной строки. Обратите внимание, что первым элементом всегда является имя самого выполняемого сценария, независимо от способа запуска (смотрите врезку «Выполняемые сценарии в Unix» далее в этой главе):

C:\...\PP4E\System> python testargv.py

[‘testargv.py’]

C:\...\PP4E\System> python testargv.py spam eggs cheese

[‘testargv.py’, ‘spam’, ‘eggs’, ‘cheese’]

C:\...\PP4E\System> python testargv.py -i data.txt -o results.txt

[‘testargv.py’, ‘-i’, ‘data.txt’, ‘-o’, ‘results.txt’]

Последняя команда в этом фрагменте иллюстрирует общепринятое соглашение. Подобно аргументам функции, параметры командной строки иногда передаются по позиции, а иногда по имени с помощью пары «-имя значение». Например, пара -i data.txt означает, что значением ключа -i является data.txt (например, имя входного файла). В качестве параметров командной строки допускается передавать любые слова, но обычно программы накладывают на них некоторые структурные ограничения.

Аргументы командной строки играют в программах такую же роль, как аргументы в функциях: они просто позволяют передать в программу информацию, которая может быть различной для каждого запуска программы. То обстоятельство, что они не определяются жестко в программном коде, позволяет использовать сценарии более универсальными способами. Например, аргументы командной строки могут использоваться для передачи имен файлов сценариям, их обрабатывающим, - взгляните на сценарий more.py в главе 2 (пример 2.1), который был нашим первым примером. Другие сценарии могут принимать флаги режима обработки, адреса Интернета и так далее.

Анализ аргументов командной строки

Однако при регулярном использовании аргументов командной строки вы можете обнаружить, что писать код, который вылавливает в списке слова, неудобно. Обычно при запуске программы преобразуют список аргументов в структуры, более удобные для обработки. Ниже приводится один из способов реализации такого преобразования: сценарий в примере 3.2 просматривает список argv в поисках пар -optionname op-tionvalue и помещает их в словарь, используя в качестве ключей имена параметров, чтобы потом их было легче извлекать.

Пример 3.2. PP4E\System\testargv2.py

"собирает параметры командной строки в словаре”

def getopts(argv): opts = {} while argv:

if argv[0][0] == ‘-’:    # поиск пар "-name value”

opts[argv[0]] = argv[1] # ключами словарей будут имена параметров argv = argv[2:] else:

argv = argv[1:] return opts

if__name__== ‘__main__’:

from sys import argv    # пример клиентского программного кода

myargs = getopts(argv) if ‘-i’ in myargs:

print(myargs[‘-i’])

print(myargs)

Такую функцию можно импортировать и использовать во всех инструментах командной строки. Если запустить этот пример как самостоятельный сценарий, он просто выведет отформатированный словарь аргументов:

C:\...\PP4E\System> python testargv2.py

{}

C:\...\PP4E\System> python testargv2.py -i data.txt -o results.txt

data.txt

{‘-o’: ‘results.txt’, ‘-i’: ‘data.txt’}

Естественно, мы могли бы предусмотреть еще более сложную реализацию механизма работы с аргументами, добавить проверку ошибок и тому подобное. Для обработки более сложных командных строк мы могли бы использовать более развитые инструменты обработки командной строки из стандартной библиотеки Python:

•    Модуль getopt моделирует поведение одноименной утилиты Unix/C

•    Модуль optparse является более современной альтернативой и по общему признанию - более мощной

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