2015-03-11 9 views
7

Ich verwende klicken (http://click.pocoo.org/3/), um eine Befehlszeilenanwendung zu erstellen, aber ich weiß nicht, wie Sie eine Shell für diese Anwendung erstellen.
nehme an, ich bin ein Programm Test und ich habe Befehle genannt subtest1 und subtest2Erstellen Sie eine Shell-Befehlszeilenanwendung mit Python und klicken Sie

konnte ich es von Terminal funktioniert wie genannt schreiben:

$ test subtest1 
$ test subtest2 

Aber was ich dachte darüber nach ist eine Hülle, also könnte ich tun:

Ist das möglich? Mit Klick?

+1

Vielleicht können Sie etwas mit der [ 'prompt' Funktion] zusammen (http: // Klick .pocoo.org/3/Eingabeaufforderungen /). – mkrieger1

Antwort

11

Dies ist nicht unmöglich mit Klick, aber es gibt keine integrierte Unterstützung dafür. Das erste, was Sie tun müssten, ist, Ihren Gruppenrückruf ohne einen Unterbefehl aufrufbar zu machen, indem Sie invoke_without_command=True in den Gruppendekorator übergeben (wie beschrieben here). Dann müsste Ihr Gruppenrückruf eine REPL implementieren. Python hat das cmd Framework dafür in der Standardbibliothek zu tun. Wenn die Click-Unterbefehle dort verfügbar sind, müssen Sie cmd.Cmd.default wie im folgenden Codefragment überschreiben. Alle Details, wie help, sollten in ein paar Zeilen machbar sein.

+1

Wie würde ich zusätzliche Argumente an den Unterbefehl übergeben und sie von Click? Analysieren lassen? –

+0

Ich weiß, dass ich ziemlich spät zu diesem Spiel bin, aber schau dir meine Antwort an, wie du mit zusätzlichen Argumenten zu den Unterbefehlen umgehen kannst. (Es basiert auf dieser Antwort, auf keinen Fall wäre ich ohne sie so weit gekommen). – vimalloc

1

Ich habe versucht, etwas ähnliches wie das OP, aber mit zusätzlichen Optionen/verschachtelte Sub-Sub-Befehle. Die erste Antwort mit dem eingebauten Cmd-Modul funktionierte in meinem Fall nicht; vielleicht mit etwas mehr fiedeln .. Aber ich bin gerade über click-shell gelaufen. Ich hatte keine Gelegenheit, es ausgiebig zu testen, aber bisher scheint es genau so zu funktionieren wie erwartet.

0

Ich weiß, das ist super alt, aber ich habe an der Lösung von fpbhb gearbeitet, um Optionen zu unterstützen. Ich bin sicher, dass dies etwas mehr Arbeit verwenden konnte, aber hier ist ein einfaches Beispiel dafür, wie es getan werden könnte:

import click 
import cmd 
import sys 

from click import BaseCommand, UsageError 


class REPL(cmd.Cmd): 
    def __init__(self, ctx): 
     cmd.Cmd.__init__(self) 
     self.ctx = ctx 

    def default(self, line): 
     subcommand = line.split()[0] 
     args = line.split()[1:] 

     subcommand = cli.commands.get(subcommand) 
     if subcommand: 
      try: 
       subcommand.parse_args(self.ctx, args) 
       self.ctx.forward(subcommand) 
      except UsageError as e: 
       print(e.format_message()) 
     else: 
      return cmd.Cmd.default(self, line) 


@click.group(invoke_without_command=True) 
@click.pass_context 
def cli(ctx): 
    if ctx.invoked_subcommand is None: 
     repl = REPL(ctx) 
     repl.cmdloop() 


@cli.command() 
@click.option('--foo', required=True) 
def a(foo): 
    print("a") 
    print(foo) 
    return 'banana' 


@cli.command() 
@click.option('--foo', required=True) 
def b(foo): 
    print("b") 
    print(foo) 

if __name__ == "__main__": 
    cli()