Oto brudne obejście -
import argparse
p = argparse.ArgumentParser()
p.add_argument('--arg', action='store_true')
s = p.add_subparsers()
s.add_parser('test')
def my_parse_args(ss):
#parse the info the subparser knows about; don't issue an error on unknown stuff
namespace,leftover=p.parse_known_args(ss)
#reparse the unknown as global options and add it to the namespace.
if(leftover):
s.add_parser('null',add_help=False)
p.parse_args(leftover+['null'],namespace=namespace)
return namespace
#print my_parse_args('-h'.split()) #This works too, but causes the script to stop.
print my_parse_args('--arg test'.split())
print my_parse_args('test --arg'.split())
To działa - i można go modyfikować dość łatwo pracować z sys.argv
(wystarczy zdjąć łańcuch split „ss
”). Możesz nawet podklasować argparse.ArgumentParser
i zamienić metodę parse_args
na my_parse_args
, a wtedy nigdy nie będziesz wiedział, jaka jest różnica - mimo że podklasowanie w celu zastąpienia jednej metody wydaje mi się przesadzone.
Sądzę jednak, że jest to nieco nietypowy sposób na użycie akapitów. Ogólnie rzecz biorąc, oczekuje się, że opcje globalne pojawią się przed opcjami dla trybów z akapitem, a nie później.
Co robić masz na myśli "nieudane"? Co chcesz się stać? Jakie opcje globalne? – alan
zawodzi, ponieważ narzeka na nieznaną argumentację --arg – Ronny