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

Я изначально программист на 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