2012-03-15 26 views
19

Czy istnieje moduł Pythona dla z argumentami wiersza poleceń gem/git w stylu? Co mam na myśli przez styl gem/git to:Argumenty wiersza poleceń gem/git-style w pythniku ​​

$ ./MyApp.py 
The most commonly used MyApp commands are: 
    add  Add file contents to the index 
    bisect  Find by binary search the change that introduced a bug 
    branch  List, create, or delete branches 
    checkout Checkout a branch or paths to the working tree 
    ... 

$ ./MyApp.py branch 
    * current-branch 
    master 

Bez argumentów wynik wskazuje, w jaki sposób można kontynuować. Jest też specjalna komenda "help":

$ ./MyApp.py help branch 

Dzięki temu otrzymasz głębsze wskazówki na temat polecenia "branch".

Edit: I przez robi To znaczy robi drukowanie użytkowania dla was, wychodzi z nieprawidłowych danych wejściowych, uruchamia swoje funkcje zgodnie ze specyfikacją CLI. Sortuj "program odwzorowujący adresy URL" dla wiersza poleceń.

Odpowiedz

30

Tak, argparse z add_subparser().

Jest to dobrze wyjaśnione w sekcji Sub-commands.

Kopiowanie jeden z przykładów stamtąd:

>>> parser = argparse.ArgumentParser() 
>>> subparsers = parser.add_subparsers() 
>>> checkout = subparsers.add_parser('checkout', aliases=['co']) 
>>> checkout.add_argument('foo') 
>>> parser.parse_args(['checkout', 'bar']) 
Namespace(foo='bar') 

Edit: Niestety nie ma własny generowane specjalnego polecenia help, ale można uzyskać opisowy komunikat pomocy (które wydają się chce) z -h lub --help jak jeden normalnie po komendzie:

$ ./MyApp.py branch --help 

przez gadatliwy I nie znaczy to, że jest jak strony man, to jak każdy inny --help rodzaj pomocy: Zamieszczone wszystkie argumenty, etc ...

Przykład:

>>> parser = argparse.ArgumentParser() 
>>> subparsers = parser.add_subparsers(description='Sub description') 
>>> checkout = subparsers.add_parser('checkout', description='Checkout description') 
>>> checkout.add_argument('foo', help='This is the foo help') 
>>> parser.parse_args(['checkout', '--help']) 
usage: checkout [-h] foo 

Checkout description 

positional arguments: 
    foo   This is the foo help 

optional arguments: 
    -h, --help show this help message and exit 

Jeśli trzeba, to powinno być łatwe do wdrożenia polecenia help który przekierowuje do --help.

+0

Warto zauważyć, że słowo kluczowe 'aliases' to' rozporządzenie.add_parser() 'jest nowe w Pythonie 3 i niedostępne w Pythonie 2.7. – Juan

+0

Ostrożnie z argparse: gdy zaczniesz dodawać zagnieżdżone poziomy, rzeczy stają się bardzo niechlujne. Zobacz na przykład: http://bugs.python.org/issue9253 – Federico

+0

Wspaniały pakiet [click] (http://click.pocoo.org/) oferuje tę funkcjonalność po wyjęciu z pudełka! Sprawdź tutorial * complex * [tutaj] (http://click.pocoo.org/5/complex/) –

4

Rozsądny Hack aby uzyskać zachowanie gem/style git "Pomoc" (ja po prostu napisał to co ja pracuję na tak):

parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers(dest='sub_commands') 
parser_branch = subparsers.add_parser('branch', description='list of branches') 
parser_help = subparsers.add_parser('help') 
parser_help.add_argument('command', nargs="?", default=None) 

# I can't find a legitimate way to set a default subparser in the docs 
# If you know of one, please let me know! 
if len(sys.argv) < 2: 
    sys.argv.append('--help') 

parsed = parser.parse_args() 

if parsed.sub_commands == "help": 
    if not parsed.command: 
     parser.parse_args(['--help']) 
    else: 
     parser.parse_args([parsed.command, '--help']) 

argparse to zdecydowanie krok w górę od optparse i inne rozwiązania Pythona, z którymi się zetknąłem. Ale IMO w stylu gem/git obsługi argumentów jest po prostu bardziej logicznym i bezpieczniejszym sposobem robienia rzeczy, więc irytujące jest to, że nie jest obsługiwane.

Powiązane problemy