2016-05-05 17 views
3

So schrieb ich eine Python 3-Bibliothek, die als eine Anwendung "Back-End" dient. Jetzt kann ich mich mit dem Interpreter zusammensetzen, die Quelldatei (en) importieren und mit der lib herumhacken - ich weiß, wie das geht.Erstellen einer Python-Befehlszeilenanwendung

Aber ich möchte auch eine Befehlszeile 'Frontent' Anwendung mit der Bibliothek erstellen. Meine Bibliothek definiert einige Objekte mit übergeordneten Befehlen, die von der Anwendung sichtbar sein sollen. Solche Befehle können einige Datenstrukturen zurückgeben und die übergeordneten Befehle würden sie gut drucken. Mit anderen Worten, die Befehlszeilen-App wäre ein dünner Wrapper um die Lib herum, übergibt ihre Eingabe an die Bibliotheksbefehle und präsentiert Ergebnisse für den Benutzer.

Das beste Beispiel für das, was ich erreichen möchte, wäre wahrscheinlich Mercurial SCM, wie es in Python geschrieben ist und der 'hg' Befehl tut, was ich suche - zum Beispiel 'hg commit -m Nachricht 'wird den Code finden, der für die Implementierung des Befehls' commit 'verantwortlich ist, die Argumente vom Benutzer übergeben und seine Arbeit erledigen. Auf dem Rückweg könnte es einige Ergebnisse geben und sie gut ausdrucken.

Gibt es eine allgemeine Vorgehensweise in Python? Wie exponieren Klassen/Methoden/Funktionen als 'high level' Befehle mit einer Annotation? Kennt jemand Tutorials?

+2

Verwenden Sie ['argparse'] (https://docs.python.org/3/library/argparse.html), um die Befehlszeilenargumente zu analysieren. Rufen Sie von dort aus die Methoden in Ihrer Bibliothek auf und drucken Sie die Ergebnisse. – dsh

+2

Haben Sie in klicken Sie http://click.pooco.org/5/? – Adib

+0

Ist das nicht eher eine Bash-Frage? Sie können die Befehle, die Sie in Ihrem bash-Profil haben wollen, mit alias "python script.py args" versehen. Und dann parsen Sie diese Argumente mit etwas wie "argparse" in Ihrem Skript aus. – Bahrom

Antwort

1

Sie können dies mit tun. Zum Beispiel hier ist der Anfang meines deploy Skripts.

def main(argv): 
    """ 
    Entry point for the deploy script. 

    Arguments: 
     argv: All command line arguments save the name of the script. 
    """ 
    parser = argparse.ArgumentParser(description=__doc__) 
    parser.add_argument('-v', '--verbose', action='store_true', 
         help='also report if files are the same') 
    parser.add_argument('-V', '--version', action='version', 
         version=__version__) 
    parser.add_argument('command', choices=['check', 'diff', 'install']) 
    fname = '.'.join(['filelist', pwd.getpwuid(os.getuid())[0]]) 
    args = parser.parse_args(argv) 

Es verwendet ein Argument mit Auswahlmöglichkeiten, um eine Funktion auszuwählen. Sie könnten eine Wörterbuchzuordnungsauswahl für Funktionen definieren;

cmds = {'check': do_check, 'diff': do_diff, 'install': do_install} 
fn = cmds[args.command] 

Wenn Sie sicherstellen, dass alle dict Schlüssel in der Befehlsauswahl sind, brauchen Sie nicht KeyError zu fangen.

+0

Ich gehe für argparse. Es ist einfach genug, unterstützt Unterbefehle (denke 'git commit' ) und ist bereits installiert. Vielen Dank. – wujek