Montag, 30. September 2013

 

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):

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".
Anmerkung: Möglicherweise sind die genauen Bezeichnungen bzw. Beschriftungen beim GUI nicht ganz korrekt, denn die hängen von der Version sowie von Typ der Grafischen Oberfläche (GUI = Graphical User Interface) ab. Die (Shell-) Befehle sind jedoch korrekt.

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.
Ein paar Beispiele:
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:~$
Mehr Informationen zur Shell (Kommandozeile) gibt es hier: Bash (Shell)

Kommandozeilenparameter mit Python bearbeiten

Das (Standard-) Modul sys 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$ 
Die Zeile
#!/usr/bin/python3
dient 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$ 
Bei der Ausgabeumleitung auf die Datei 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 -h an die Kommandozeile anhängen.

In der Hilfe/Info muss auch immer der Programmname wie im Beispiel ausgegeben werden (sys.argv[0])!

Labels: , ,


Kommentare:

Kommentar veröffentlichen

Abonnieren Kommentare zum Post [Atom]





<< Startseite

This page is powered by Blogger. Isn't yours?

Abonnieren Posts [Atom]