Der folgende Code, der die Subparser von argparse verwendet, schlägt auf Python 3 fehl, läuft aber wie erwartet in Python 2. Nach dem Vergleichen der Dokumente kann ich immer noch nicht sagen, warum.Warum verhält sich dieser Argarse-Code zwischen Python 2 und 3 anders?
#!/usr/bin/env python
from __future__ import print_function
from argparse import ArgumentParser
def action(args):
print(args)
if __name__ == '__main__':
std = ArgumentParser(add_help=False)
std.add_argument('standard')
ap = ArgumentParser()
sp = ap.add_subparsers()
cmd = sp.add_parser('subcommand', parents=[std], description='Do subcommand')
cmd.add_argument('arg')
cmd.set_defaults(do=action)
args = ap.parse_args()
args.do(args)
Die Ausgabe von Python 2.7.6 ist:
[email protected]$ python test.py
usage: test.py [-h] {subcommand} ...
test.py: error: too few arguments
In Python 3.3.5, die ich erhalten:
[email protected]$ python3 test.py
Traceback (most recent call last):
File "test.py", line 21, in <module>
args.do(args)
AttributeError: 'Namespace' object has no attribute 'do'
Beachten Sie, dass wenn Sie einen Subparser verwenden: 'args = cmd.parse_args()' würde es funktionieren. – alecxe
Dieser Code scheint den gleichen Fehler für mich auf Python 2.7.4 zu geben. Höchstwahrscheinlich haben Sie die falsche Dateiversion oder etwas ähnliches. Es sollte nicht funktionieren. Probieren Sie es noch einmal vorsichtig. – bosnjak
Wenn ich Ihren Code in einem Python 2.7.6 Interpreter eintippe, bekomme ich den gleichen Fehler in der Zeile 'args = ap.parse_args()'. –