Произвольные аргументы командной строки в python - PullRequest
2 голосов
/ 28 июля 2010

Я хочу разрешить произвольные аргументы командной строки. Если пользователь предоставляет мне командную строку, которая выглядит следующим образом

myscript.py --a valueofa --b valueofb posarg1 posarg2

Я знаю, что a было передано с valueofa, b передано с valueofb и что у меня есть последние два позиционных аргумента.

Я всегда использовал optparse, для которого вы точно указываете, какие аргументы искать. Но я хочу, чтобы пользователь мог определять произвольные «макросы» из командной строки. Конечно, есть модуль Python, который делает это более элегантно, чем все, что я бы написал. Что такое?

Ответы [ 3 ]

2 голосов
/ 28 июля 2010

К сожалению, вы не можете . Если вам нужно это поддержать, вам нужно написать свой собственный параметр parser = (.

1 голос
/ 06 октября 2015

arbitrary_args.py:

#!/usr/bin/env python3

import sys


def parse_args_any(args):
    pos = []
    named = {}
    key = None
    for arg in args:
        if key:
            if arg.startswith('--'):
                named[key] = True
                key = arg[2:]
            else:
                named[key] = arg
                key = None
        elif arg.startswith('--'):
            key = arg[2:]
        else:
            pos.append(arg)
    if key:
        named[key] = True
    return (pos, named)


def main(argv):
    print(parse_args_any(argv))


if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))

$./arbitrary_args.py cmd posarg1 posarg2 --foo --bar baz posarg3 --quux:

(['cmd', 'posarg1', 'posarg2', 'posarg3'], {'foo': True, 'bar': 'baz', 'quux': True})

argparse_arbitrary.py:

#!/usr/bin/env python3
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-D', action='append', )
D = {L[0]:L[1] for L in [s.split('=') for s in parser.parse_args().D]}
print(D)

$./argparse_arbitrary.py -Ddrink=coffee -Dsnack=peanut

{'закуска': 'арахис', 'напиток': 'кофе'}

0 голосов
/ 28 июля 2010

Будет argparse делать то, что вы хотите?Недавно он был добавлен в стандартную библиотеку.В частности, вы можете посмотреть этот раздел документации.

...