Wer Python verwendet, der will früher oder später seine Anwendung in ein Kommandozeilen-Tool umwandeln um das Verhalten der Anwendung über unterschiedliche Parameter zu steuern. In diesem Artikel wird eine einfache HexDump Anwendung mit Kommandozeilenparameter erweitert. Verwendet wird Python in der Version 3.
Das folgende Listing zeigt eine HexDump Anwendung namens hexdump.py welche sich momentan einfach selbst in einer Hexadezimal Ansicht darstellt:
Hierbei finden sich bereits vorbereitete Variablen mit dem Prefix arg_
.
Diese sollen über die Kommandozeilen befüllt werden.
Python bringt hierfür eine Bibliothek namens argparse mit.
Als Implementierungsbeispiel soll das folgende Listing dienen:
Hier wird zunächst eine ArgumentParser
Instanz erstellt (Zeile 6) und
die Standardgruppe entfernt (Zeile 10). Persöhnlich mag ich es nicht
wenn die Standardgruppe mit dem Hilfstext für die Hilfe angezeigt wird.
Die ArgumentParser
Klasse bietet die Möglichkeit Parametergruppen
zu erstellen welche, wenn das Programm mit dem Argument -h
Aufgerufen wird,
alle Befehlsbeschreibungen mit entsprechenden Befehlsgruppenüberschriften
versieht und deren Hilfetexte ausgibt.
Weiterführend werden zwei Gruppen angelegt mit benötigten (Zeile 13..15) sowie optionalen Argumenten (Zeile 17..25) angelegt und schliesslich in Zeile 28 verarbeitet. Die Klasse nimmt sich dabei die Eingabeargument von der Befehlszeile.
Interessanterweise erhält man im Erfolgsfall eine Instanz mit Eigenschaften
und Werten zurück bei dennen die Eigenschaften die Bezeichner der bei
der Argumentdefinition übergebenen zweiten Parameter annehmen.
So wird zum Beisüpiel aus "--width"
» args.width
.
Diese Tatsache wird in Zeile 31 bis 37 genutzt um die vorherigen Konstantendefinitionen mit Benutzerwerten zu füllen.
Die obige Implementierung erzeugt, wenn mit hexdump.py -h
aufgerufen, die folgende Aussgabe:
usage: hexdump.py [-h] -i INPUT [-w WIDTH] [-p PREFIX] [-n] [-c COLUMNS]
Python Hexdump
required arguments:
-i INPUT, --input INPUT
Input file to show hexadecimal content for.
optional arguments:
-w WIDTH, --width WIDTH
Address display width in bytes.
Default is 4.
-p PREFIX, --prefix PREFIX
Address prefix.
Default is '0x'.
-n, --noaddress Do not show any addresses.
-c COLUMNS, --columns COLUMNS
Number of columns to show per row.
Bei einer fehlerhaften eingabe wie hexdump.py -o test
wird
eine entsprechende Fehlernachricht generiert:
usage: hexdump.py [-h] -i INPUT [-w WIDTH] [-p PREFIX] [-n] [-c COLUMNS]
hexdump.py: error: unrecognized arguments: -o xyz
Dem aufmerksamen Leser ist nun sicherlich aufgefallen das die Felder
arg_hex_dump_show
und arg_ascii_dump_show
noch gar nicht abgedeckt sind.
Hierfür habe ich mir etwas spezieles überlegt, da es keinen Sinn macht weder die HEX noch die ASCII anzuzeigen erlaube ich nur eine von beiden oder beide aber nicht keine. Hierfür bietet sich ein Enumdefinition an:
Diese Klasse kann dann als Argumentationdefinition für argparse
verwendet werden, sodass die
Werte both
, hex
und ascii
als Eingabeparameter für das Argument -v
akzeptiert werden.
Ein Aufruf von hexdump.py -i hexdump.py -w 8 -c 8 -p $ -v hex
solte zur folgende Ausgabe führen:
Hex view of file 'hexdump.py' with size 3585 byte(s).
$0000000000000000 69 6d 70 6f 72 74 20 6d
$0000000000000008 61 74 68 0d 0a 69 6d 70
$0000000000000010 6f 72 74 20 65 6e 75 6d
$0000000000000018 0d 0a 69 6d 70 6f 72 74
$0000000000000020 20 61 72 67 70 61 72 73
$0000000000000028 65 0d 0a 0d 0a 0d 0a 63
$0000000000000030 6c 61 73 73 20 48 65 78
$0000000000000038 56 69 65 77 54 79 70 65
$0000000000000040 45 6e 75 6d 28 65 6e 75
$0000000000000048 6d 2e 49 6e 74 45 6e 75
$0000000000000050 6d 29 3a 0d 0a 20 20 20
Damit ist dies nun auch das Ende dieses Artikels. Ich hoffe diese kurze Anleitung konnte einen Einblick in die Benutzung und Handhabung von argparse geben.