Въведение

В този блог ще проучим различните начини, по които можете да използвате модула argparse в Python за обработка на аргументи от командния ред във вашите програми.

Ако някога сте писали интерфейс на командния ред (CLI) в Python, знаете, че анализирането и обработката на аргументи на командния ред може да бъде досадна и податлива на грешки задача. За щастие, модулът argparse в стандартната библиотека на Python предоставя прост и мощен начин за справяне с тази задача.

В този блог ще покрием всичко, което трябва да знаете за argparse, от основите на дефиниране и анализиране на аргументи на командния ред до усъвършенствани техники за работа с по-сложни сценарии. До края на този блог ще имате цялостно разбиране за argparse и ще бъдете оборудвани със знанията и уменията, за да го използвате ефективно във вашите собствени програми.

Така че да започваме!

Първи стъпки с argparse

За да използвате модула argparse във вашата програма на Python, първо ще трябва да го импортирате подобно на други пакети на Python, т.е. import argparse. След като импортирате argparse, можете да дефинирате аргументите на командния ред, които вашата програма ще приеме, като използвате обект ArgumentParser. Този обект предоставя удобен начин за указване на аргументите, които вашата програма ще приеме, както и всички допълнителни опции или функции, които искате да включите.

Например, ето как можете да дефинирате прост ArgumentParser обект, който приема един задължителен аргумент от командния ред:

В този пример filename е името на аргумента на командния ред, а 'The name of the file to process' е кратко описание, което ще се покаже на потребителя, когато програмата се изпълнява с флага -h или --help.

За да анализирате аргументите на командния ред, предадени на вашата програма, можете да използвате метода parse_args() на обекта ArgumentParser. Това ще анализира аргументите на командния ред и ще върне обект Namespace, съдържащ стойностите на аргументите. В този пример обектът args ще има атрибут filename, който съдържа стойността на аргумента filename, предадена на програмата.

Разширени техники за argparse

Досега разгледахме основите на използването на argparse за дефиниране и анализиране на аргументи на командния ред във вашите програми на Python. Argparse обаче е мощен и гъвкав модул, който може да се използва и за обработка на широк набор от по-напреднали сценарии.

Една усъвършенствана функция на argparse е възможността да се укаже броят на аргументите, които опцията на командния ред трябва да приеме, като се използва параметърът nargs. Например, можете да използвате nargs='+', за да укажете, че дадена опция трябва да приема един или повече аргументи, или nargs='?', за да укажете, че дадена опция е незадължителна и трябва да приема нула или един аргумент.

Ето пример за това как можете да използвате параметъра nargs, за да дефинирате опция на командния ред, която приема едно или повече имена на файлове:

В този пример опцията -f или --files ще приеме едно или повече имена на файлове, които ще бъдат съхранени в списък в атрибута files на обекта Namespace, върнат от parse_args().

Друга усъвършенствана функция на argparse е възможността за указване на стойности по подразбиране за опции. Това може да бъде полезно, ако искате да предоставите поведение по подразбиране за опция, ако тя не е посочена в командния ред. Например, можете да използвате параметъра default, за да посочите стойност по подразбиране за опция:

В този пример опцията -o или --output по подразбиране ще бъде 'output.txt', ако не е указана в командния ред.

Сложен пример

import argparse 
parser = argparse.ArgumentParser(prog='myprogram', description='Process some files') 

# Required arguments 
parser.add_argument('input', help='The input file') 
parser.add_argument('output', help='The output file') 

# Optional arguments 
parser.add_argument('-v', ' - verbose', action='store_true', help='Enable verbose output')
parser.add_argument('-o', ' - overwrite', action='store_true', help='Overwrite the output file if it exists')
parser.add_argument('-n', ' - num-records', type=int, default=10, help='The number of records to process') 

# Mutually exclusive arguments 
group = parser.add_mutually_exclusive_group() 
group.add_argument('-u', ' - uppercase', action='store_true', help='Convert the output to uppercase') 
group.add_argument('-l', ' - lowercase', action='store_true', help='Convert the output to lowercase') 

# Arguments with choices 
parser.add_argument('-c', ' - compression', choices=['gzip', 'bzip2', 'lzma'], help='The compression algorithm to use') 

# Positional arguments with variable number of inputs 
parser.add_argument(' - exclude', nargs='+', help='Exclude the specified files from processing') 

# Parse the command line arguments 
args = parser.parse_args()

Горният код импортира модула argparse и създава ArgumentParser обект, който ще се използва за анализиране и обработка на аргументи от командния ред за програма на Python.

Обектът ArgumentParser се инициализира с аргумент prog, който указва името на програмата, и аргумент description, който предоставя кратко описание на програмата.

След това кодът дефинира редица аргументи на командния ред, използвайки метода add_argument() на обекта ArgumentParser. Методът add_argument() приема редица незадължителни параметри, които могат да се използват за определяне на поведението и характеристиките на аргумента.

Първите два дефинирани аргумента са input и output, които са задължителни аргументи, които нямат никакви опции или флагове, свързани с тях. Тези аргументи са последвани от няколко незадължителни аргумента, които се идентифицират с водещи - или -- и се определят с помощта на опциите -v, -o и -n.

Кодът също дефинира група от взаимно изключващи се аргументи, използвайки метода add_mutually_exclusive_group() и опциите -u и -l. Това означава, че само една от тези опции може да бъде зададена в даден момент.

След това кодът дефинира аргумент, който има фиксиран набор от възможности за избор, използвайки параметъра choices и опцията -c. Този аргумент може да бъде зададен само с една от трите стойности, изброени в параметъра choices.

И накрая, кодът дефинира позиционен аргумент с променлив брой входове, използвайки параметъра nargs и опцията -exclude. Този аргумент може да бъде зададен с произволен брой стойности, които ще бъдат съхранени в списък.

След като всички аргументи са дефинирани, кодът използва метода parse_args() на обекта ArgumentParser, за да анализира аргументите на командния ред и да съхрани стойностите в обект Namespace. След това този обект може да се използва за достъп до стойностите на аргументите в останалата част от програмата.

Алтернативни опции за argparse

Въпреки че argparse е мощен и широко използван модул за анализиране и обработка на аргументи от командния ред в Python, той може да не винаги е най-подходящият за всяка ситуация. Налични са редица алтернативни опции, които може да са по-подходящи за вашите специфични нужди.

Една популярна алтернатива на argparse е модулът docopt, който ви позволява да дефинирате интерфейса на командния ред на вашата програма, като използвате прост и интуитивен синтаксис, базиран на естествен език. Например, ето как можете да дефинирате интерфейс на командния ред с помощта на docopt:

"""
Usage:
  myprogram.py [options] <input> <output>
Options:
  -h, --help              Show this screen
  -v, --verbose           Enable verbose output
  -o, --overwrite         Overwrite the output file if it exists
"""

В този пример docopt ще анализира аргументите на командния ред и ще върне речник, съдържащ стойностите на аргументите.

Друг вариант, който трябва да разгледате, е модулът click, който е мощна и гъвкава библиотека за изграждане на интерфейси на командния ред в Python. click предоставя широк набор от функции и опции за персонализиране, включително поддръжка за подкоманди, автоматична помощ и съобщения за грешки и много други.

Заключение

В заключение, модулът argparse в стандартната библиотека на Python е мощен и гъвкав инструмент за анализиране и обработка на аргументи от командния ред във вашите програми на Python. Независимо дали създавате прост интерфейс на командния ред или по-сложно приложение, argparse предоставя набор от функции и опции за персонализиране, които могат да ви помогнат да се справите с широк набор от сценарии.

Следвайки насоките и примерите, предоставени в този блог, вече трябва да имате цялостно разбиране за това как да използвате argparse, за да дефинирате и анализирате аргументите на командния ред във вашите програми на Python. Независимо дали сте начинаещ или опитен разработчик, надявам се, че сте намерили този блог за ценен ресурс и че ви е помогнал да разберете по-добре възможностите на argparse.

Ще се видим в следващата публикация, пазете се!

~ Итън



Повече съдържание в PlainEnglish.io. Регистрирайте се за нашия безплатен седмичен бюлетин. Следвайте ни в Twitter, LinkedIn, YouTube и Discord .

Интересувате ли се от мащабиране на стартирането на вашия софтуер? Вижте Circuit.