Рубрики
Без рубрики

Приложения CLI с Python

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

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, in 
    total = 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”