2013-12-19 14 views
6

mit -h Wenn ich ./foo.py h laufen, wo foo.py der folgende Code mit dem Fehler abstürzt istIn Python argparse stürzt ab, wenn

ValueError: too many values to unpack

Hier ist der Code.

#!/usr/bin/python 
import argparse 

parser = argparse.ArgumentParser(description='Find matrices.') 
parser.add_argument('integers', metavar=('n','h'), type=int, nargs=2, help='Dimensions of the matrix') 
(n,h)= parser.parse_args().integers 

Gibt es einen Fehler in meinem Code?

Volltraceback (Python 2.7.3):

Traceback (most recent call last): 
    File "argp.py", line 15, in <module> 
    (n,h)= parser.parse_args().integers 
    File "/usr/lib/python2.7/argparse.py", line 1688, in parse_args 
    args, argv = self.parse_known_args(args, namespace) 
    File "/usr/lib/python2.7/argparse.py", line 1720, in parse_known_args 
    namespace, args = self._parse_known_args(args, namespace) 
    File "/usr/lib/python2.7/argparse.py", line 1926, in _parse_known_args 
    start_index = consume_optional(start_index) 
    File "/usr/lib/python2.7/argparse.py", line 1866, in consume_optional 
    take_action(action, args, option_string) 
    File "/usr/lib/python2.7/argparse.py", line 1794, in take_action 
    action(self, namespace, argument_values, option_string) 
    File "/usr/lib/python2.7/argparse.py", line 994, in __call__ 
    parser.print_help() 
    File "/usr/lib/python2.7/argparse.py", line 2313, in print_help 
    self._print_message(self.format_help(), file) 
    File "/usr/lib/python2.7/argparse.py", line 2280, in format_help 
    formatter.add_arguments(action_group._group_actions) 
    File "/usr/lib/python2.7/argparse.py", line 273, in add_arguments 
    self.add_argument(action) 
    File "/usr/lib/python2.7/argparse.py", line 258, in add_argument 
    invocations = [get_invocation(action)] 
    File "/usr/lib/python2.7/argparse.py", line 534, in _format_action_invocation 
    metavar, = self._metavar_formatter(action, action.dest)(1) 
ValueError: too many values to unpack 
+0

Interessant, bis jetzt, für mich sieht das wie ein Fehler in 'argparse' aus. –

+0

Bestätigt, es gibt bereits einen Fehlerbericht: http://bugs.python.org/issue14074 –

Antwort

7

Dies ist ein Fehler in argparse wo nargs, ein Tupel metavar und Positionsargumente nicht mischen. integers ist ein Positionsargument, kein optionaler --integers Switch.

Entweder es ein optionales Argument machen:

parser.add_argument('--integers', metavar=('n','h'), type=int, nargs=2, help='Dimensions of the matrix') 

oder zwei Positionsargumente verwenden:

parser.add_argument('n', type=int, help='Dimensions of the matrix') 
parser.add_argument('h', type=int, help='Dimensions of the matrix') 

statt.

Siehe issue 14074 im Python-Bug-Tracker für vorgeschlagene Korrektur für den Fehler.

+0

Danke, dass Sie den Fehler gefunden haben! – marshall

+0

Das Übergeben von 'add_help = False' an' ArgumentParser() 'deaktiviert das Hilfe-Langformat von' -h'. Das heißt, './foo.py -h 'gibt die gleichen Informationen aus wie'./Foo.py'. Es ist keine Lösung, aber zumindest stürzt die App nicht ab. – Paglian