Как читать/обрабатывать аргументы командной строки?
Я изначально программист на C. Я видел множество трюков и "хаков", чтобы читать много разных аргументов.
Каковы некоторые из способов, которыми программисты Python могут это сделать?
Связанные
Ответы
Ответ 1
Каноническим решением в стандартной библиотеке является argparse
(docs):
Вот пример:
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
поддерживает (среди прочего):
- Несколько вариантов в любом порядке.
- Короткие и длинные варианты.
- Значения по умолчанию.
- Генерация сообщения об использовании.
Ответ 2
import sys
print("\n".join(sys.argv))
sys.argv
- это список, который содержит все аргументы, передаваемые сценарию в командной строке.
В принципе,
import sys
print(sys.argv[1:])
Ответ 3
Просто обойдя евангелизацию argparse, что лучше для этих причины.. по существу:
(скопировано из ссылки)
-
Модуль argparse может обрабатывать позиционные
и необязательные аргументы, в то время как
optparse может обрабатывать только необязательные
Аргументы
-
argparse не догматичен
что ваш интерфейс командной строки
должен выглядеть так: опции, такие как -file
или/файл, а также
требуемые параметры. Optparse отказывается
поддерживать эти функции, предпочитая
чистота над практичностью
-
argparse производит больше
информативные сообщения об использовании, включая
использование командной строки, определенное из
ваши аргументы и справочные сообщения для
как позиционные, так и факультативные
аргументы. Модуль optparse
требует, чтобы вы сами использовали свое использование
строка и не имеет способа показать
помощь для позиционных аргументов.
-
argparse поддерживает действие, которое
потребляют переменное число
аргументы командной строки, а optparse
требует, чтобы точное число
аргументы (например, 1, 2 или 3)
заранее
-
argparse поддерживает парсеры, которые
отправка в под-команды, в то время как
optparse требует установки
allow_interspersed_args
и выполните
рассылка парсера вручную
И мой личный фаворит:
- argparse позволяет использовать тип и
параметры действия до
add_argument()
уточняется простым
callables, в то время как optparse требует
атрибуты класса хакинга, такие как
STORE_ACTIONS
или CHECK_METHODS
, чтобы получить
проверка правильных аргументов
Ответ 4
Существует также argparse
stdlib module ( "impovement" в модуле 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
Ответ 5
Один из способов сделать это - использовать sys.argv
. Это напечатает имя script в качестве первого аргумента и всех других параметров, которые вы передадите ему.
import sys
for arg in sys.argv:
print arg
Ответ 6
Библиотека docopt действительно гладкая. Он строит аргумент 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)
Ответ 7
Если вам нужно что-то быстрое и не очень гибкое
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
чтобы получить следующий вывод:
Привет Джеймс Смит
Ответ 8
#set default args as -h , if no args:
if len(sys.argv) == 1: sys.argv[1:] = ["-h"]
Ответ 9
Я сам использую optparse, но очень люблю направление, которое Симон Уиллисон берет с недавно представленной библиотекой optfunc. Он работает:
", исследующий функцию определение (включая его аргументы и их значения по умолчанию) и использование что для построения командной строки парсер аргументов."
Итак, например, это определение функции:
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
Ответ 10
Мне нравится 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" неявным).
Ответ 11
Как вы можете видеть optparse "Модуль optparse устарел и не будет развиваться дальше, разработка будет продолжена с argparse."
Ответ 12
Pocoo click более интуитивно понятен, требует меньше шаблонов и, по крайней мере, настолько же эффективен, как и argparse.
Единственная слабость, с которой я столкнулся до сих пор, заключается в том, что вы не можете много настраивать, чтобы помогать страницам, но это обычно не является обязательным требованием и docopt кажется ясным выбором, когда он есть.
Ответ 13
Вам может быть интересен небольшой модуль Python, который я написал, чтобы упростить обработку аргументов командной строки (с открытым исходным кодом и свободно использовать) - Commando
Ответ 14
Я рекомендую посмотреть docopt в качестве простой альтернативы этим другим.
docopt - это новый проект, который работает, анализируя ваше сообщение использования -help, вместо того, чтобы требовать от вас самого реализовать все. Вам просто нужно разместить свое сообщение об использовании в формате POSIX.
Ответ 15
Еще один вариант argh. Он основывается на 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()
Он автоматически генерирует справку и т.д., и вы можете использовать декораторы, чтобы предоставить дополнительные указания о том, как должен работать анализ arg.
Ответ 16
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
Ответ 17
Мое решение entrypoint2. Пример:
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