2013-08-16 14 views
18

Z argparsem Pythona, jak utworzyć podkomendę wymaganą argumentacją? Chcę to zrobić, ponieważ chcę argparse do błędu, jeśli nie określono podkomendy. Zastępuję metodę błędu, aby zamiast tego wydrukować pomoc. Mam podkomend zagnieżdżone 3-głęboko, więc nie jest to kwestia obsługi zero argumentów na najwyższym poziomie.argparse z wymaganymi podkomendami

W poniższym przykładzie, jeśli to się nazywa jak tak, to otrzymamy:

$./simple.py 
$ 

Co chcę zrobić, zamiast dla argparse do skarżą się, że wymagane komenda nie została określona:

import argparse 

class MyArgumentParser(argparse.ArgumentParser): 
    def error(self, message): 
     self.print_help(sys.stderr) 
     self.exit(0, '%s: error: %s\n' % (self.prog, message)) 

def main(): 
    parser = MyArgumentParser(description='Simple example') 
    subs = parser.add_subparsers() 
    sub_one = subs.add_parser('one', help='does something') 
    sub_two = subs.add_parser('two', help='does something else') 

    parser.parse_args() 

if __name__ == '__main__': 
    main() 

Odpowiedz

31

Nastąpiła zmiana w 3.3 w komunikacie o błędzie dla potrzebnych argumentów i podkomendy zagubiły się w prochu.

http://bugs.python.org/issue9253#msg186387

Nie sugeruję to obejść, ustawiając atrybut required po subparsers jest zdefiniowana.

parser = ArgumentParser(prog='test') 
subparsers = parser.add_subparsers() 
subparsers.required = True 
subparsers.dest = 'command' 
subparser = subparsers.add_parser("foo", help="run foo") 
parser.parse_args() 
+0

Doskonale, tego właśnie potrzebowałem. Działa teraz świetnie, a ja będę uważać na poprawkę. – PonyEars

0

Jak korzystać z required=True? Więcej informacji: here.

+4

To nie jest obsługiwana przez 'add_subparsers()' metoda: 'TypeError: __init __() dostał nieoczekiwaną argumentu słowa kluczowego„required'' – Bakuriu

+1

Ach, masz rację. Mój błąd. –

+0

Dodajemy to do Pythona 3.7 i domyślnie go traktujemy. Lepiej późno niż wcale ¯ \\ _ (ツ) _/¯ –

0

Można użyć dest argument, który jest udokumentowany w ostatnim przykładzie w dokumentacji dla add_subparsers():

# required_subparser.py 
import argparse 

parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers(dest='subparser_name') 
one = subparsers.add_parser('one') 
two = subparsers.add_parser('two') 

args = parser.parse_args() 

Bieg:

$python required_subparser.py 
usage: required_subparser.py [-h] {one,two} ... 
required_subparser.py: error: too few arguments 
$python required_subparser.py one 
$# no error 
+0

Nie jestem pewien, czy czegoś tu nie ma, ale nie otrzymuję komunikatu "usage:" podczas uruchamiania przykładu. Wracam do pytania bez wyjścia z argumentem lub bez niego. Korzystam z Pythona 3.3.2 i argparse, które mu towarzyszyły. – PonyEars

+1

@redstreet Nie wspomniałeś, że używasz Pythona3.3 i przetestowałem go używając systemu 'python', który jest pythonem 2.7. Rzeczywiście w python3.3 nie otrzymujesz wiadomości. – Bakuriu

+0

Tak, ponieważ nie spodziewałem się, że jest to spowodowane błędem (który uzależnił to od wersji!). Dziękuję za odpowiedź i za wypróbowanie wersji 2.7! – PonyEars

Powiązane problemy