Kommandozeilen-Argumente in Python

Hallo da draußen,

hier mal glatt mein erster Beitrag in der Kategorie Python. Wie bereits in den News geschrieben, entwickle ich gerade ein Mini-Tool, der die Übersetzung eines meiner Projekte vereinfachen soll. Im Projekt wird jeder Text, der auf der Oberfläche genutzt wird, z.B. als Label oder Message einer Text-Datei zugeordnet und dann sprachspezifisch in verschiedenen Unterordnern abgelegt. Sicherlich ist das nicht der beste Weg, das hätte man durchaus auch als properties-Datei zusammenfassen können, aber seis drum – das war damals nicht meine Entscheidung, sondern ist halt als gegeben zu sehen.
Dadurch haben wir hunderte von Text-Dateien, die wohl beim Übersetzer graue Haare wachsen lassen haben (hunderte Dateien aufmachen, übersetzen, speichern, schließen).
Daher war die Idee von einem meiner Kunden-Mitarbeitern das ganze irgendwie zu vereinfachen. Ich habe dann vorgeschlagen, das in eine Excel-Datei zu generieren, wobei der Name der Text-Datei die erste Spalte und in den folgenden Spalten jeweils die verschiedenen sprachabhängigen Texte hineingeschrieben werden.
Soweit so gut.

Das Tool, was ich erstelle, soll im Endeffekt alle Dateien in dem Hauptverzeichnis durchgehen, sich den Namen merken und dann die entsprechenden sprachspezifischen Dateien öffnen, den Text auslesen und in das Excel-File schreiben.
Obwohl ich das sicherlich in Java hätte machen können, habe ich mich dann doch für Python entschieden, einfach um mal wieder etwas komplett neues zu lernen und da die Entwicklungsumgebung sowieso auf Linux läuft und das mal von Haus aus mitkommt.

Der zweite Teil des Tools liest dann später wieder die Excel-Tabelle ein und erzeugt dann entsprechend wieder die Textdateien daraus.

Die Umsetzung (des ersten Teils) war eigentlich ziemlich schnell erledigt, mit kurzem Einlesen in Python war die erste Version in knapp einem halben Tag fertig. Die erste Version erzeugte erst mal immer nur eine Excel-Datei mit fest definiertem Namen. Da mein Anspruch aber irgendwann ist, das auch dynamisch zu machen, habe ich kurz in der Python-Doku nachgelesen und die Möglichkeit gefunden, Kommandozeilen-Argumente in python auszulesen.

Dazu gibt es das sys.argv – Array. Hier muss man aber echt höllisch aufpassen – vor allem wenn man als Argument einen Dateinamen nutzen will, in den man irgendetwas schreiben möchte.

Hier mal der Text-Ausschnitt, des falschen Codes:

  # Die sys-Bibliothek importieren
  import sys
  from openpyxl import Workbook 
  # Standard-Dateiname initialisieren
  filename="translations.xlsx"
  if len(sys.argv) > 0:
     filename=sys.argv[0]
  # Excel-Generierung mit openpyxl...
  # schreiben in die Datei
  workbook.save(filename)

Hier hatte ich die Doku mal wieder nur überflogen und war der Meinung, dass die Argv-Sachen genauso funktionieren wie bei Java. Mit einem katastrophalen Ergebnis. Als ich nämlich das Script ausführte, generierte er zwar eine Excel-Datei aber eben nicht in die translation.xlsx und auch nicht in den der Funktion übergebenen Dateinamen sondern er schrieb das einfach mal so in die Python-Script-Datei und zerstörte mir damit komplett mein Script.
Glück im Unglück hatte ich mir kurz vor der Anpassung das Script als Mail an mich selbst geschickt, so dass ich zumindest nicht wieder komplett von vorne anfangen musste. Puh.

ALSO: Solltet ihr irgendeinen Dateinamen zum Schreiben als 1. Parameter auf der Kommandozeile auslesen, nutzt NICHT sys.argv[0] und len(sys.argv)>0, sondern sys.argv[1] und len(sys.argv)>1!! Ansonsten geht es Euch wie mir und ihr überschreibt rigeros euer schönes Python-Script.

Hier also der korrekte Code:

  # Die sys-Bibliothek importieren
  import sys
  from openpyxl import Workbook
  # Standard-Dateiname initialisieren
  filename="translations.xlsx"
  if len(sys.argv) > 1:
     filename=sys.argv[1]
  #Excel-Generierung mit openpyxl....
  #schreiben in die Datei
  workbook.save(filename)

Also immer schön aufpassen und Euch nicht den Code kaputt machen.

Kommandozeilen-Argumente in Python
Markiert in:                 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.