100 -страница Python Intro (20 Part Series)
В этой главе будут показаны несколько примеров обработки аргументов CLI с использованием система
и Argparse
модули. FileInput
Модуль также представлен в этой главе, которая удобна для редактирования файлов на месте.
sys.argv
Аргументы командной строки, принятые при выполнении программы Python, можно получить как список
струн через sys.argv
. Первый элемент (index 0
) содержит имя сценария Python или -c
или пустая строка, в зависимости от того, как был вызван интерпретатор Python. Остальные элементы будут иметь аргументы командной строки, если таковые имеются вдоль сценария, который будет выполнен. Смотрите docs.python: sys.argv Больше подробностей.
Вот программа, которая принимает два числа, передаваемых в виде аргументов CLI и отображает сумму только в том случае, если ввод был передан правильно.
# sum_two_nums.py import ast import sys try: num1, num2 = sys.argv[1:] total = ast.literal_eval(num1) + ast.literal_eval(num2) except ValueError: sys.exit('Error: Please provide exactly two numbers as arguments') else: print(f'{num1} + {num2} = {total}')
ast.literal_eval () Метод удобен для преобразования строкового значения в встроенные литералы, особенно для типов сбора данных. Если вы хотите использовать int ()
и float ()
Для приведенной выше программы вам придется добавить логику для разделения ввода на целые числа и сначала с плавающей точкой. Передача строки sys.exit () печатается в Stderr
Поток и устанавливает статус выхода как 1
В дополнение к прекращению сценария.
Вот образец пробега:
$ python3.9 sum_two_nums.py 2 3.14 2 + 3.14 = 5.140000000000001 $ echo $? 0 $ python3.9 sum_two_nums.py 2 3.14 7 Error: Please provide exactly two numbers as arguments $ echo $? 1 $ python3.9 sum_two_nums.py 2 abc Error: Please provide exactly two numbers as arguments
В качестве упражнения измените вышеуказанную программу для обработки TypeError
исключения. Вместо вывода, показанного ниже, сообщите пользователю об ошибке, используя sys.exit ()
метод
$ python3.9 sum_two_nums.py 2 [1] Traceback (most recent call last): File "/home/learnbyexample/Python/programs/sum_two_nums.py", line 6, intotal = ast.literal_eval(num1) + ast.literal_eval(num2) TypeError: unsupported operand type(s) for +: 'int' and 'list'
В качестве другого упражнения примите одно или несколько чисел в качестве входных аргументов. Рассчитайте и отобразите следующие подробности о входе – сумме, продукте и среднем.
Редактирование на месте с помощью FileInput
Чтобы отредактировать файл на месте, FileInput Module пригодится. Вот программа, которая зацикливается на именах файлов, передаваемых в виде аргументов CLI (т.е. Вы также можете предоставить одно или несколько имен файлов файлы
Аргумент ключевого слова, если вы не хотите передавать их в качестве аргументов CLI.
# inplace_edit.py import fileinput with fileinput.input(inplace=True) as f: for ip_line in f: op_line = ip_line.rstrip('\n').capitalize() + '.' print(op_line)
Обратите внимание, что в отличие от open ()
, FileInput
Объект не поддерживает write ()
метод Однако использование print ()
достаточно. Вот образец пробега:
$ python3.9 inplace_edit.py [io]p.txt $ # check if files have changed $ cat ip.txt Hi there. Today is sunny. Have a nice day. $ cat op.txt This is a sample line of text. Yet another line. $ # if stdin is passed as input, inplace gets disabled $ echo 'GooD moRNiNg' | python3.9 inplace_edit.py Good morning.
Как inplace = Верно
Постоянно изменяет ваши входные файлы, всегда полезно проверить свою логику на примере файлов в первую очередь. Таким образом, ваши данные не будут потеряны из -за ошибки в вашей программе. Вы также можете спросить FileInput
Для создания резервных копий, если вам нужно восстановить исходные файлы позже – например, Backup = '. Bkp'
Создаст резервное копирование, добавив .bkp
как суффикс к оригинальным именам файлов.
Argparse
sys.argv
достаточно для простых вариантов использования. Если вы хотите создать приложение CLI с различными видами флагов и аргументов (некоторые из которых могут быть необязательными/обязательными) и т. Д., Используйте модуль, такой как встроенный Argparse
или стороннее решение, как Нажмите Анкет
Цитирование из Docs.python: argparse :
Argparse
Модуль позволяет легко писать удобные интерфейсы командной строки. Программа определяет, какие аргументы она требует, и Argparse
выяснит, как проанализировать тех, кто из sys.argv
. Argparse
Модуль также автоматически генерирует сообщения о помощи и использование и проблемы, когда пользователи дают программу неверные аргументы.
Вот приложение CLI, которое принимает файл, содержащий список имен файлов, которые должны быть отсортированы по их расширению. Файлы с одинаковым расширением дополнительно отсортированы в порядке возрастания. Программа также реализует дополнительный флаг для удаления дублирующих записей.
# sort_ext.py import argparse parser = argparse.ArgumentParser() parser.add_argument('-f', '--file', required=True, help="input file to be sorted") parser.add_argument('-u', '--unique', action='store_true', help="sort uniquely") args = parser.parse_args() ip_lines = open(args.file).readlines() if args.unique: ip_lines = set(ip_lines) op_lines = sorted(ip_lines, key=lambda s: (s.rsplit('.', 1)[-1], s)) for line in op_lines: print(line, end='')
Документация для приложения CLI генерируется автоматически на основе информации, переданной анализатору. Вы можете использовать параметры справки (которые также добавляются автоматически) для просмотра документации, как показано ниже:
$ python3.9 sort_ext.py -h usage: sort_ext.py [-h] -f FILE [-u] optional arguments: -h, --help show this help message and exit -f FILE, --file FILE input file to be sorted -u, --unique sort uniquely $ python3.9 sort_ext.py usage: sort_ext.py [-h] -f FILE [-u] sort_ext.py: error: the following arguments are required: -f/--file
add_argument ()
Метод позволяет добавлять подробную информацию о опции/аргументе для приложения CLI. Первые параметра называет аргумент или опцию (начинается с -
). Помощь
Аргумент ключевого слова позволяет добавлять документацию для этой конкретной опции/аргумента. Смотрите docs.python: add_argument Для документации и подробностей о других аргументах ключевых слов.
Приведенная выше программа добавляет два варианта: один для хранения имени файла, чтобы сортироваться, а другая – как флаг для уникальной сортировки. Вот пример текстового файла, который необходимо отсортировать на основе расширения.
$ cat sample.txt input.log basic.test input.log out.put.txt sync.py input.log async.txt
Вот результат с обоими типами сортировки, поддерживаемых программой.
# default sort $ python3.9 sort_ext.py -f sample.txt input.log input.log input.log sync.py basic.test async.txt out.put.txt # unique sort $ python3.9 sort_ext.py -uf sample.txt input.log sync.py basic.test async.txt out.put.txt
Смотрите Docs.python Howtos: Argparse Tutorial Для более подробного введения.
Принимая stdin
Кли -инструменты, такие как Греп
, sed
, ав
и многие другие могут принимать данные из stdin
а также принять имена файлов в качестве аргументов. Предыдущая программа модифицирована, чтобы добавить stdin
Функциональность показана ниже. args.file
теперь является позиционным аргументом, а не вариантом. nargs = '?
Указывает, что этот аргумент не является обязательным. type = argparse. FileType ('r')
Позволяет автоматически получить файловую руку в Читать
Режим для имени файла, предоставленного в качестве аргумента. Если имя файла не предоставлено, по умолчанию = sys.stdin
удары в И вы получаете файл -руку для stdin
данные.
# sort_ext_stdin.py import argparse, sys parser = argparse.ArgumentParser() parser.add_argument('file', nargs='?', type=argparse.FileType('r'), default=sys.stdin, help="input file to be sorted") parser.add_argument('-u', '--unique', action='store_true', help="sort uniquely") args = parser.parse_args() ip_lines = args.file.readlines() if args.unique: ip_lines = set(ip_lines) op_lines = sorted(ip_lines, key=lambda s: (s.rsplit('.', 1)[-1], s)) for line in op_lines: print(line, end='')
Вот помощь для модифицированной программы:
$ python3.9 sort_ext_stdin.py -h usage: sort_ext_stdin.py [-h] [-u] [file] positional arguments: file input file to be sorted optional arguments: -h, --help show this help message and exit -u, --unique sort uniquely
Вот образец прогона, показывающий оба stdin
и функциональность аргумента имени файла.
# 'cat' is used here for illustration purposes only $ cat sample.txt | python3.9 sort_ext_stdin.py input.log input.log input.log sync.py basic.test async.txt out.put.txt $ python3.9 sort_ext_stdin.py -u sample.txt input.log sync.py basic.test async.txt out.put.txt
Как упражнение, добавьте -o, - -output
Необязательный аргумент для хранения вывода в файле для вышеуказанной программы.
100 -страница Python Intro (20 Part Series)
Оригинал: “https://dev.to/learnbyexample/cli-apps-with-python-5en2”