2014-04-03 11 views
19

Chcę uzyskać wszystkie pozostałe nieużywane argumenty na raz. Jak mam to zrobić?Uzyskiwanie pozostałych argumentów w argparse

parser.add_argument('-i', action='store', dest='i', default='i.log') 
parser.add_argument('-o', action='store', dest='o', default='o.log') 
+0

I nie bardzo rozumiem, o co prosisz. Czy chcesz, aby wszystkie argumenty wiersza poleceń nie były parsowane przez argparse? – SingleNegationElimination

+1

Chcę uzyskać wszystkie argumenty, których nie biorę za pomocą "parser.add_arguments". To jest analogowy domyślny przełącznik – ggoha

Odpowiedz

7

Inną opcją jest dodanie pozycyjnym argumentu do parsera. Podaj opcję bez wiodących kresek, a argparse będzie je szukał, gdy żadna inna opcja nie zostanie rozpoznana. ta ma dodatkową korzyść poprawy tekst pomocy dla polecenia:

>>> parser.add_argument('otherthings', nargs='*') 
>>> parser.parse_args(['foo', 'bar', 'baz']) 
Namespace(i='i.log', o='o.log', otherthings=['foo', 'bar', 'baz']) 

i

>>> print parser.format_help() 
usage: ipython-script.py [-h] [-i I] [-o O] [otherthings [otherthings ...]] 

positional arguments: 
    otherthings 

optional arguments: 
    -h, --help show this help message and exit 
    -i I 
    -o O 
36

Zastosowanie parse_known_args():

args, unknownargs = parser.parse_known_args() 
+2

Jest to przydatne, gdy nieznane argumenty mogą mieć wiodące kreski. Na przykład przekazujesz je do innego skryptu. – Core

+0

* To * powinno być zaakceptowaną odpowiedzią! – MLu

+0

Nie działa, jeśli chcesz zezwolić na przekazywanie sprzecznych nazw argumentów do pakowanego polecenia, na przykład w 'docker-compose-wrapper.py --help' zamiast' docker-compose-wrapper.py exec --help' – pdd

10

użytkowania argparse.REMAINDER:

parser.add_argument('rest', nargs=argparse.REMAINDER) 

Przykład przedłużenia postępowania:

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('-i', action='store', dest='i', default='i.log') 
parser.add_argument('-o', action='store', dest='o', default='o.log') 
parser.add_argument('rest', nargs=argparse.REMAINDER) 
parser.parse_args(['hello', 'world']) 
>>> Namespace(i='i.log', o='o.log', rest=['hello', 'world']) 
+0

To jest IMO najlepsze rozwiązanie dla przypadków, w których pakujesz inne polecenie: 'wrapper.py --help' -> Twój tekst pomocy ' wrapper.py niektóre argumenty --help' -> Przekazywane do zapakowane polecenie – pdd

Powiązane problemy