Как прочитать / обработать аргументы командной строки?
-
06-07-2019 - |
Вопрос
Изначально я программист на языке Си.Я видел множество трюков и "взломов" для чтения множества различных аргументов.
Каковы некоторые из способов, которыми программисты Python могут это сделать?
Похожие
- Каков наилучший способ захватить / проанализировать аргументы командной строки, переданные скрипту Python?
- Реализация интерфейсов командной строки в стиле “[команда] [действие] [параметр]”?
- Как я могу обработать аргументы командной строки в Python?
- Как мне отформатировать справку по позиционным аргументам, используя optparse в Python?
Решение
Каноническим решением в стандартной библиотеке является argparse
(Документы):
Вот один из примеров:
from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument("-f", "--file", dest="filename",
help="write report to FILE", metavar="FILE")
parser.add_argument("-q", "--quiet",
action="store_false", dest="verbose", default=True,
help="don't print status messages to stdout")
args = parser.parse_args()
argparse
поддержка (среди прочего):
- Несколько вариантов в любом порядке.
- Короткие и длинные варианты.
- Значения по умолчанию.
- Генерация справочного сообщения по использованию.
Другие советы
import sys
print("\n".join(sys.argv))
sys.argv
представляет собой список, содержащий все аргументы, переданные скрипту в командной строке.
В основном,
import sys
print(sys.argv[1:])
Просто ходил повсюду, проповедуя евангелие для argparse ( аргумент ) что лучше для эти причины..по существу:
(скопировано по ссылке)
модуль argparse может обрабатывать позиционные и необязательные аргументы, в то время как optparse может обрабатывать только необязательные аргументы
argparse не догматичен в отношении того, как должен выглядеть ваш интерфейс командной строки - поддерживаются такие опции, как -file или /file, а также обязательные опции.Optparse отказывается поддерживать эти функции, предпочитая чистоту практичности
argparse выдает более информативные сообщения об использовании, включая использование командной строки, определяемое на основе ваших аргументов, и справочные сообщения для как позиционных, так и необязательных аргументов.Модуль optparse требует, чтобы вы написали свое собственное использование строка и не имеет способа отображения справка по позиционным аргументам.
argparse поддерживает действие, которое использует переменное количество аргументов командной строки, в то время как optparse требует, чтобы точное количество аргументов (например1, 2 или 3) должно быть известно заранее
argparse поддерживает анализаторы, которые отправляют во вложенные команды, в то время как optparse требует настройки
allow_interspersed_args
и выполняем отправку синтаксического анализатора вручную
И мой личный фаворит:
- argparse позволяет параметрам типа и
действия
add_argument()
должен быть указан с помощью простых вызываемых объектов, в то время как optparse требует взлома атрибутов класса, таких какSTORE_ACTIONS
илиCHECK_METHODS
чтобы получить правильную проверку аргументов
Существует также argparse
модуль stdlib ("обеднение" в stdlib optparse
модуль).Пример из введение в argparse:
# script.py
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument(
'integers', metavar='int', type=int, choices=range(10),
nargs='+', help='an integer in the range 0..9')
parser.add_argument(
'--sum', dest='accumulate', action='store_const', const=sum,
default=max, help='sum the integers (default: find the max)')
args = parser.parse_args()
print(args.accumulate(args.integers))
Использование:
$ script.py 1 2 3 4
4
$ script.py --sum 1 2 3 4
10
Один из способов сделать это - использовать sys.argv
.При этом в качестве первого аргумента будет напечатано имя скрипта и все остальные параметры, которые вы ему передаете.
import sys
for arg in sys.argv:
print arg
В докопт библиотека действительно шикарная.Он создает аргумент dict из строки использования для вашего приложения.
Например, из docopt readme:
"""Naval Fate.
Usage:
naval_fate.py ship new <name>...
naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
naval_fate.py ship shoot <x> <y>
naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
naval_fate.py (-h | --help)
naval_fate.py --version
Options:
-h --help Show this screen.
--version Show version.
--speed=<kn> Speed in knots [default: 10].
--moored Moored (anchored) mine.
--drifting Drifting mine.
"""
from docopt import docopt
if __name__ == '__main__':
arguments = docopt(__doc__, version='Naval Fate 2.0')
print(arguments)
Если вам нужно что-то быстрое и не очень гибкое
main.py:
import sys
first_name = sys.argv[1]
last_name = sys.argv[2]
print("Hello " + first_name + " " + last_name)
Тогда беги python main.py James Smith
чтобы получить следующий результат:
Привет, Джеймс Смит
#set default args as -h , if no args:
if len(sys.argv) == 1: sys.argv[1:] = ["-h"]
Я сам использую optparse, но мне действительно нравится направление, в котором Саймон Уиллисон использует свой недавно представленный дополнительная функция библиотека.Это работает с помощью:
"анализируем функцию определение (включая ее аргументы и их значения по умолчанию) и используем это для построения командной строки анализатор аргументов".
Так, например, это определение функции:
def geocode(s, api_key='', geocoder='google', list_geocoders=False):
преобразуется в этот текст справки optparse:
Options:
-h, --help show this help message and exit
-l, --list-geocoders
-a API_KEY, --api-key=API_KEY
-g GEOCODER, --geocoder=GEOCODER
Мне нравится getopt из stdlib, например:
try:
opts, args = getopt.getopt(sys.argv[1:], 'h', ['help'])
except getopt.GetoptError, err:
usage(err)
for opt, arg in opts:
if opt in ('-h', '--help'):
usage()
if len(args) != 1:
usage("specify thing...")
В последнее время я оборачивал что-то похожее на это, чтобы сделать вещи менее подробными (например;делая "-h" неявным).
Как вы можете видеть optparse ( выборочный анализ ) "Модуль optparse устарел и не будет разрабатываться в дальнейшем;разработка будет продолжена с argparse ( аргумент ) модуль".
Покоо щелчок является более интуитивно понятным, требует меньше шаблонности и, по крайней мере, столь же мощным, как argparse.
Единственная слабость, с которой я столкнулся до сих пор, заключается в том, что вы не можете выполнить большую настройку для страниц справки, но обычно это не является обязательным требованием и докопт кажется очевидным выбором, когда это так.
Возможно, вас заинтересует небольшой модуль Python, который я написал, чтобы еще больше упростить обработку аргументов командной строки (с открытым исходным кодом и бесплатно использовать) - Коммандос
Я рекомендую посмотреть на докопт как простая альтернатива этим другим.
docopt - это новый проект, который работает путем анализа вашего сообщения об использовании --help вместо того, чтобы требовать от вас реализации всего самостоятельно.Вам просто нужно поместить свое сообщение об использовании в формат POSIX.
Еще одним вариантом является аргх.Он основан на argparse и позволяет вам писать такие вещи, как:
import argh
# declaring:
def echo(text):
"Returns given word as is."
return text
def greet(name, greeting='Hello'):
"Greets the user with given name. The greeting is customizable."
return greeting + ', ' + name
# assembling:
parser = argh.ArghParser()
parser.add_commands([echo, greet])
# dispatching:
if __name__ == '__main__':
parser.dispatch()
Он автоматически сгенерирует справку и так далее, и вы можете использовать декораторы для предоставления дополнительных указаний о том, как должен работать синтаксический анализ аргументов.
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the integers (default: find the max)')
args = parser.parse_args()
print(args.accumulate(args.integers))
Assuming the Python code above is saved into a file called prog.py
$ python prog.py -h
Ref-link: https://docs.python.org/3.3/library/argparse.html
Мое решение таково точка входа 2.Пример:
from entrypoint2 import entrypoint
@entrypoint
def add(file, quiet=True):
''' This function writes report.
:param file: write report to FILE
:param quiet: don't print status messages to stdout
'''
print file,quiet
текст справки:
usage: report.py [-h] [-q] [--debug] file
This function writes report.
positional arguments:
file write report to FILE
optional arguments:
-h, --help show this help message and exit
-q, --quiet don't print status messages to stdout
--debug set logging level to DEBUG