Sonntag, 23. September 2012
Python Kommandozeilenparameter
Kommandozeile (unter Linux/Unix)
Gleich zur Kommandozeilenbearbeitung mit Python
Folgender Artikel gibt einen kurzen Einblick in die Geschichte der Kommandozeile: Commandline resurrected.
Viele Aufgaben lassen sich auch wesentlich schneller auf der Kommandozeile erledigen als mit der grafischen Oberfläche (Click-Click-Drag usw). Ein paar Beispiele (Shell bedeutet hier Kommandozeile):
Viele Aufgaben lassen sich auch wesentlich schneller auf der Kommandozeile erledigen als mit der grafischen Oberfläche (Click-Click-Drag usw). Ein paar Beispiele (Shell bedeutet hier Kommandozeile):
Suche alle .c Dateien, die neuer sind als Makefile.
Shell... | find . -name ' *.c' -newer Makefile -print |
GUI... | Öffne den Explorer, navigiere zum entsprechenden Verzeichnis, Klicke auf die Datei Makefile und merke das Änderungsdatum bzw. Zeit.
Dann Starte Tools/Find und gib *.c als Suchkriterium ein. Wähle den Datumsreiter und gib das gemerkte Datum ein. Klicke OK. |
Erzeuge an zip/tar-Archiv meines Sourcecodes (C-Code).
Shell... | zip archive.zip *.h *.c oder
tar cvf archive.tar *.h *.c |
GUI... | Öffne ein ZIP-Werkzeug (z.B. WinZip), wähle "Neues Archiv", gib den Namen ein, wähle das (Quell-)Verzeichnis im Hinzufügen Dialog, setze den Filter auf *.c und klicke "Hinzufügen", dann setze einen weiteren Filter auf *.h und klicke "Hinzufügen" und schließe das Archiv wieder. |
Ein letztes Beispiel:
Welche Java-Dateien wurden letzte Woche geändert?
Shell... | find . -name '*.java' -mtime +7 -print |
GUI... | Klicke und navigiere zu "Suche Dateien", klicke auf "Name" und gib "*.java" ein, wähle "Datum letzte Änderung" und klicke auf "Beginndatum", gib das Startdatum des Projekts ein (wann war das, verd**** noch mal?). Weiters klicke auf "Endedatum" und gib das Datum von vor einer Woche ein (schau mal schnell auf einen Kalender...). Klicke "Suche". |
Befehls-Syntax
Unix (Linux) Befehle haben folgende einheitliche Struktur. Bis auf den Befehlsnamen (Programmname) sind grundsätzlich alle anderen Angaben optional.Befehlsname [Option...] [Argument...] [Ein-/Ausgabeumlenkung]Die eckigen Klammern deuten an, dass dieser Parameter optional ist. Die drei Punkte geben zusätzlich an, dass mehrere solcher Parameter möglich sind.
Optionen sind syntaktisch von anderen Argumenten unterscheidbar: sie beginnen mit einem Minus, haben einen Buchstaben und danach optional ein Argument für diese Option
-x [Argument]oder sie beginnen mit zwei Minus und einem Optionsnamen sowie dem optionalen Argument.
--Optionsname [Argument]
Befehlsargumente sind Dateinamen oder andere für den Befehl wichtige Informationen.
Normalerweise lesen Unix-Programme Eingaben vom Terminal und geben Ausgaben auf das Terminal aus. Diese Datenkanäle können durch Ein-Ausgabeumlenkung geändert werden. Diese Umleitungen unterscheiden sich ebenfalls von den Optionen und anderen Argumenten (< Eingabedatei, > Ausgabedatei und | für die Pipe).
- <
- Das Kommando liest von der angegebenen Datei (statt von der Tastatur).
- >
- Das Kommando schreibt in die angegebene Datei (statt auf das Terminal).
- |
- Die Ausgabe des Kommandos links vom | wird als Eingabe für das Kommando rechts vom | verwendet. Die Kommandos sind über eine Pipe (Leitung, Rohrleitung) verbunden.
hh@knuth:~$ cd workspace hh@knuth:~/workspace$ ls c2bf demo eclimd.log guidemo libbf programmierblog python python3 python-sum pythontest pythonX scm-demo _SCRIPTS_ unit-tests hh@knuth:~/workspace$ cd c2bf hh@knuth:~/workspace/c2bf$ ls 1tox cc GPL ld Makefile math README strip test.sh wrapper hh@knuth:~/workspace/c2bf$ cd cc hh@knuth:~/workspace/c2bf/cc$ ls ast.h c2bf-cc c2bf-dispast dispast.c dispast.o genbf genbf.h genbfmain.c genbfmain.o gram.o gram.y main.c main.o Makefile README.txt scan.l scan.o tests y.output y.tab.h hh@knuth:~/workspace/c2bf/cc$ ls *.c *.h ast.h dispast.c genbf.h genbfmain.c main.c y.tab.h hh@knuth:~/workspace/c2bf/cc$ ls -l *.c *.h -rw-rw-r-- 1 hh hh 21061 Aug 31 21:40 ast.h -rw-rw-r-- 1 hh hh 30503 Aug 31 21:40 dispast.c -rw-rw-r-- 1 hh hh 6627 Aug 31 21:40 genbf.h -rw-rw-r-- 1 hh hh 953 Aug 31 21:40 genbfmain.c -rw-rw-r-- 1 hh hh 917 Aug 31 21:40 main.c -rw-rw-r-- 1 hh hh 7631 Aug 31 21:45 y.tab.h hh@knuth:~/workspace/c2bf/cc$ cd hh@knuth:~$
Kommandozeilenparameter mit Python bearbeiten
Das (Standard-) Modulsys
ermöglicht es von Python auf die Umgebung, in der Python läuft, zuzugreifen. In unserem Fall wenden wir uns der Kommandozeile zu.
#!/usr/bin/python3 import sys print("commandline:") for arg in sys.argv: print(arg)
hh@knuth:/tmp$ vim cmd.py hh@knuth:/tmp$ cat cmd.py #!/usr/bin/python3 import sys print("commandline:") for arg in sys.argv: print(arg) hh@knuth:/tmp$ python3 cmd.py -o --option par1 par2 commandline: cmd.py -o --option par1 par2 hh@knuth:/tmp$ chmod +x cmd.py hh@knuth:/tmp$ ./cmd.py -o --option par1 par2 commandline: ./cmd.py -o --option par1 par2 hh@knuth:/tmp$
#!/usr/bin/python3dient dazu, dem Betriebssystem zu sagen, mit welchem Programm diese (Text-) Datei zu starten ist, wenn man sie mit
chmod +x file
ausführbar gemacht hat.
Sie sehen, dass alle Parameter nach
python3
ausgegeben werden. Ist die Pythondatei ausführbar, bekommt man die (fast) dieselbe Ausgabe (./
vor einem Kommando bedeutet, dass dieses Kommando im aktuellen Verzeichnis und nicht im Pfad zu finden ist).
hh@knuth:/tmp$ python3 Python 3.2.3 (default, Sep 10 2012, 18:14:40) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> type(sys.argv) <class 'list'> >>>
sys.argv
ist eine Liste, die alle Kommandozeilenparameter inklusive des Scriptnamens enthält. Das Pythonprogramm muss die Argumente entsprechend behandeln: Optionen erkennen, Argumente verwenden. Nur die Ein-/Ausgabeumlenkung braucht man nicht im Programm behandeln (solange man nur die Standardkanäle verwendet).
hh@knuth:/tmp$ ./cmd.py -o --option par1 par2 > outputfile hh@knuth:/tmp$ cat outputfile commandline: ./cmd.py -o --option par1 par2 hh@knuth:/tmp$
outfile
"verschwindet" die Ausgabe in dieser Datei.
Ein einfaches Beispiel, das den "Typ" der Argumente ausgibt:
import sys def info(progname): """print some information""" print(str.format(""" usage: {0} [-h] [parameter...] prints type of parameters Options: -h ... this help (c) 2012 Harald R. Haberstroh """, progname)) if __name__ == '__main__': if "-h" in sys.argv: info(sys.argv[0]) else: for arg in sys.argv: if arg.isdigit(): print("number", arg) elif arg.isalpha(): print("word", arg) else: print("string", arg)
hh@knuth:/tmp$ python3 cmdline.py 123 Harald '+$' -h usage: cmdline.py [-h] [parameter...] prints type of parameters Options: -h ... this help (c) 2012 Harald R. Haberstroh hh@knuth:/tmp$ python3 cmdline.py 123 Harald '+$' string cmdline.py number 123 word Harald string +$ hh@knuth:/tmp$
Ihre Python-Programme sollten immer eine Hilfe mit der Option -h oder --help anbieten. Dort muss auch Ihr Name und die Klasse ausgegeben werden.
Nach der Ausgabe der Hilfe (Info) soll das Programm beendet werden. Damit kann man wie im obigen Beispiel einfach
In der Hilfe/Info muss auch immer der Programmname wie im Beispiel ausgegeben werden (
Nach der Ausgabe der Hilfe (Info) soll das Programm beendet werden. Damit kann man wie im obigen Beispiel einfach
-h
an die Kommandozeile anhängen.
In der Hilfe/Info muss auch immer der Programmname wie im Beispiel ausgegeben werden (
sys.argv[0]
)!
Abonnieren Posts [Atom]
Kommentar veröffentlichen