Как читать / обрабатывать аргументы командной строки? - PullRequest

Ответы [ 17 ]

498 голосов
/ 18 июня 2009
import sys

print("\n".join(sys.argv))

sys.argv - список, содержащий все аргументы, переданные сценарию в командной строке.

В основном,

import sys
print(sys.argv[1:])
381 голосов
/ 18 июня 2009

Каноническое решение в стандартной библиотеке: 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 поддерживает (между прочим):

  • Несколько вариантов в любом порядке.
  • Короткие и длинные варианты.
  • Значения по умолчанию.
  • Создание сообщения помощи по использованию.
125 голосов
/ 26 июня 2009

Прохождение евангелизации для argparse , что лучше для этих причин .. по существу:

(скопировано по ссылке)

  • Модуль argparse может обрабатывать позиционные и необязательные аргументы, в то время как optparse может обрабатывать только опционально аргументы

  • argparse не является догматичным какой у вас интерфейс командной строки должен выглядеть так - опции вроде -file или / файл поддерживаются, как есть обязательные опции. Optparse отказывается поддерживать эти функции, предпочитая чистота над практичностью

  • argparse производит больше информационные сообщения об использовании, в том числе использование командной строки определяется из ваши аргументы и сообщения помощи для как позиционный, так и дополнительный аргументы. Модуль optparse требует от вас написать собственное использование строка, и не имеет возможности отобразить справка по позиционным аргументам.

  • argparse поддерживает действие, которое потреблять переменное число аргументы командной строки, а optparse требует, чтобы точное количество аргументы (например, 1, 2 или 3) должны быть известны заранее

  • argparse поддерживает парсеры, которые отправка в подкоманды, в то время как optparse требует настройки allow_interspersed_args и делает отправка парсера вручную

И мой личный фаворит:

  • argparse позволяет тип и параметры действия до add_argument() уточнять с помощью простого вызываемые, в то время как optparse требует взломать атрибуты класса, такие как STORE_ACTIONS или CHECK_METHODS, чтобы получить правильная проверка аргументов
65 голосов
/ 18 июня 2009

Существует также argparse модуль stdlib («улучшение» в модуле optparse stdlib). Пример из введение в 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
48 голосов
/ 18 июня 2009

Один из способов сделать это - использовать sys.argv. Это выведет имя сценария в качестве первого аргумента и все остальные параметры, которые вы передадите ему.

import sys

for arg in sys.argv:
    print arg
47 голосов
/ 09 февраля 2013

Библиотека docopt действительно хороша. Он создает аргумент dict из строки использования для вашего приложения.

Например, из документа docopt:

"""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)
38 голосов
/ 25 октября 2015

Если вам нужно что-то быстрое и не очень гибкое

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

для получения следующего вывода:

Привет Джеймс Смит

25 голосов
/ 11 мая 2012
#set default args as -h , if no args:
if len(sys.argv) == 1: sys.argv[1:] = ["-h"]
19 голосов
/ 18 июня 2009

Я сам использую optparse, но мне действительно нравится направление, в котором движется Саймон Виллисон со своей недавно представленной библиотекой optfunc . Работает:

"анализ функции определение (включая его аргументы и их значения по умолчанию) и использование что построить командную строку анализатор аргументов. "

Так, например, это определение функции:

def geocode(s, api_key='', geocoder='google', list_geocoders=False):

превращается в этот вспомогательный текст справки:

    Options:
      -h, --help            show this help message and exit
      -l, --list-geocoders
      -a API_KEY, --api-key=API_KEY
      -g GEOCODER, --geocoder=GEOCODER
8 голосов
/ 18 июня 2009

Мне нравится 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" неявным).

...