2010-07-28 2 views
1

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

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

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

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

+1

. «Макросы»? –

+0

Аналог, который я имел в виду, использовал gcc как '-Dthismacro = macrovalue' –

ответ

2

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

0

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

+1

Я думаю, что это не так:« Метод parse_args пытается дать ошибки всякий раз, когда пользователь явно совершил ошибку »означает, что неопределенные аргументы вызовут ошибки. На самом деле, я думаю, что это преднамеренное поведение - не часто вы хотите разрешить, например, орфографические ошибки. – katrielalex

0

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', «поз arg3 '], {' Foo ': Правда, 'бар': 'Баз', '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

{' закуски ':' арахит ',' drink ':' coffee '}

Смежные вопросы