2012-01-31 12 views
5

Chciałbym użyć argparse do przeanalizowania argumentów, które zna, a następnie pozostawić resztę nietkniętą. Na przykład chcę, aby być w stanie uruchomićPozostaw argumenty nietknięte argumserem

performance -o output other_script.py -a opt1 -b opt2 

który wykorzystuje opcję -o i pozostawia reszta nietknięta.

Moduł profiler.py robi coś podobnego z optparse, ale ponieważ używam argparse robię:

def parse_arguments(): 
    parser = new_argument_parser('show the performance of the given run script') 
    parser.add_argument('-o', '--output', default='profiled.prof') 

    return parser.parse_known_args() 

def main(): 
    progname = sys.argv[1] 
    ns, other_args = parse_arguments() 
    sys.argv[:] = other_args 

co wydaje się również do pracy, ale co się stanie, jeśli również other_script.py także ma flagę -o?

Czy ogólnie istnieje lepszy sposób rozwiązania tego problemu?

Odpowiedz

5

argparse zatrzyma się, aby przeanalizować argument do EOF lub --. Jeśli chcesz mieć argument, bez beeing analizowany przez argparse, można napisać ::

python [PYTHONOPTS] yourfile.py [YOURFILEOPT] -- [ANYTHINGELSE] 
+0

Ach nie wiedzieli o tym, dzięki! Bez markera byłoby naprawdę trudno zrozumieć, co się dzieje, chyba nie jest to łatwy problem. –

+0

Należy wyjaśnić, że musisz użyć metody 'parse_known_args()' (przynajmniej na python3. 6) – krishonadish

12

Można również dodać pozycyjnym argumentu do parsera z nargs=argparse.REMAINDER, aby uchwycić scenariusz i jego opcje:

# In script 'performance'... 
p = argparse.ArgumentParser() 
p.add_argument("-o") 
p.add_argument("command", nargs=argparse.REMAINDER) 
args = p.parse_args() 
print args 

uruchomić powyższy skrypt minimalny ...

$ performance -o output other_script.py -a opt1 -b opt2 
Namespace(command=['performance', '-a', 'opt1', '-b', 'opt2'], o='output') 
+1

również 'parse_known_args' powinien to zrobić. –

+0

To wydaje się pozostawić nawet "-" nienaruszone. Idealny! – user1338062

Powiązane problemy