Python Language
CLI-Unterbefehle mit präziser Hilfeausgabe
Suche…
Einführung
Verschiedene Möglichkeiten zum Erstellen von Unterbefehlen wie hg
oder svn
mit der genauen Befehlszeilenschnittstelle und Hilfeausgabe (siehe Abschnitt "Anmerkungen")
Das Analysieren von Befehlszeilenargumenten deckt ein breiteres Thema der Argumentanalyse ab.
Bemerkungen
Verschiedene Möglichkeiten zum Erstellen von Unterbefehlen wie hg
oder svn
mit der Befehlszeilenschnittstelle in der Hilfemeldung
usage: sub <command>
commands:
status - show status
list - print list
Nativer Weg (keine Bibliotheken)
"""
usage: sub <command>
commands:
status - show status
list - print list
"""
import sys
def check():
print("status")
return 0
if sys.argv[1:] == ['status']:
sys.exit(check())
elif sys.argv[1:] == ['list']:
print("list")
else:
print(__doc__.strip())
Ausgabe ohne Argumente:
usage: sub <command>
commands:
status - show status
list - print list
Pros:
- keine deps
- Jeder sollte das lesen können
- vollständige Kontrolle über die Formatierung der Hilfe
argparse (Standard-Hilfeformatierer)
import argparse
import sys
def check():
print("status")
return 0
parser = argparse.ArgumentParser(prog="sub", add_help=False)
subparser = parser.add_subparsers(dest="cmd")
subparser.add_parser('status', help='show status')
subparser.add_parser('list', help='print list')
# hack to show help when no arguments supplied
if len(sys.argv) == 1:
parser.print_help()
sys.exit(0)
args = parser.parse_args()
if args.cmd == 'list':
print('list')
elif args.cmd == 'status':
sys.exit(check())
Ausgabe ohne Argumente:
usage: sub {status,list} ...
positional arguments:
{status,list}
status show status
list print list
Pros:
- kommt mit Python
- Option Parsing ist enthalten
argparse (benutzerdefinierte Formatierungshilfe)
Erweiterte Version von http://www.riptutorial.com/python/example/25282/argparse--default-help-formatter- diese festgelegte Hilfeausgabe
import argparse
import sys
class CustomHelpFormatter(argparse.HelpFormatter):
def _format_action(self, action):
if type(action) == argparse._SubParsersAction:
# inject new class variable for subcommand formatting
subactions = action._get_subactions()
invocations = [self._format_action_invocation(a) for a in subactions]
self._subcommand_max_length = max(len(i) for i in invocations)
if type(action) == argparse._SubParsersAction._ChoicesPseudoAction:
# format subcommand help line
subcommand = self._format_action_invocation(action) # type: str
width = self._subcommand_max_length
help_text = ""
if action.help:
help_text = self._expand_help(action)
return " {:{width}} - {}\n".format(subcommand, help_text, width=width)
elif type(action) == argparse._SubParsersAction:
# process subcommand help section
msg = '\n'
for subaction in action._get_subactions():
msg += self._format_action(subaction)
return msg
else:
return super(CustomHelpFormatter, self)._format_action(action)
def check():
print("status")
return 0
parser = argparse.ArgumentParser(usage="sub <command>", add_help=False,
formatter_class=CustomHelpFormatter)
subparser = parser.add_subparsers(dest="cmd")
subparser.add_parser('status', help='show status')
subparser.add_parser('list', help='print list')
# custom help messge
parser._positionals.title = "commands"
# hack to show help when no arguments supplied
if len(sys.argv) == 1:
parser.print_help()
sys.exit(0)
args = parser.parse_args()
if args.cmd == 'list':
print('list')
elif args.cmd == 'status':
sys.exit(check())
Ausgabe ohne Argumente:
usage: sub <command>
commands:
status - show status
list - print list
Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow