Seite 1 von 1

sys.argv[1] Prüfen ?

Verfasst: Freitag 16. Januar 2015, 14:54
von digi
Hi,

Ich schreibe mein erstes Python Programm. Bislang habe ich mit Gambas programmiert.


Hier mein bisheriger Code:

Code: Alles auswählen

#!/usr/local/bin/python
# coding: latin-1

import sys
import os

if (sys.argv):
    a = sys.argv[1]
    a  = a.replace("qrg://", "") 
    a  = a.replace(".", ""); 
  
  
    if os.path.isfile("qrg.conf"):
        print "vorhanden"
        fobj = open("qrg.conf")
        for line in fobj:
          print line.rstrip()
        fobj.close()

    else:
     print "Fehler: Kann Konfigdatei nicht lesen"

else:
    print "Fehler:  Falscher Programmaufruf "
    print " -? oder -h für Hilfe"

Ich bekomme folgende Fehlermeldung:

Code: Alles auswählen

dirk@dirk-Satellite-L500:~/Projekte/python$ python ./qrg.py
Traceback (most recent call last):
  File "./qrg.py", line 8, in <module>
    a = sys.argv[1]
IndexError: list index out of range
dirk@dirk-Satellite-L500:~/Projekte/python$ 

Irgendwie is mir das alles seldsam.

Grüße und gute Gedanken
Dirk

Re: sys.argv[1] Prüfen ?

Verfasst: Freitag 16. Januar 2015, 15:03
von Sirius3
@digi: Du übergibst keinen Kommandzeilenparameter, deshalb ist enthält sys.argv nur ein Element, nämlich den Programmdateinamen.

Re: sys.argv[1] Prüfen ?

Verfasst: Freitag 16. Januar 2015, 15:12
von digi
Ja genau deshalb wollte ich die IF Verzweigung machen und einen Text ausgeben wenn kein Parameter übergeben wird.

mfg

Re: sys.argv[1] Prüfen ?

Verfasst: Freitag 16. Januar 2015, 15:45
von BlackJack
@digi: Das würde aber nur klappen wenn `sys.argv` leer wäre wenn man kein Argument übergibt, ist es aber nie, denn das erste Element ist immer vorhanden und ist normalerweise der Programmname unter dem das ganze ausgeführt wird. Lass Dir `sys.argv` einfach mal ausgeben, dann siehst Du was da enthalten ist.

Sonstige Anmerkungen: Die Einrückung sollte konsistent mit vier Leerzeichen pro Ebene erfolgen.

Die Klammern um die Bedingung sind überflüssig.

Das erste `replace()`, soll das tatsächlich eines sein, oder soll damit diese Zeichenkette *vom Anfang* von `a` entfernt werden sofern vorhanden?

Den Test ob es sich um eine Datei handelt macht man so in Python nicht. Wenn es keine Datei ist, dann wird `open()` das schon durch eine Ausnahme mitteilen. Sowie auch alle möglichen anderen Probleme, zum Beispiel das es zwar eine Datei ist, man dafür aber keine Leserechte hat. Den Fall behandelst Du im Moment gar nicht.

Dateien sollte man wenn sich das anbietet immer mit der ``with``-Anweisung zusammen öffnen. Dann wird die Datei auf jeden Fall beim Verlassen des ``with``-Blocks geschlossen, egal aus welchem Grund der Block verlassen wird. Sonst müsste man mit ``try``/``finally`` arbeiten und das schliessen der Datei im ``finally``-Block erledigen wenn man es genau so robust wie mit ``with`` haben möchte.

`a` und `fobj` sind keine besonders guten Namen. Die verraten dem Leser nicht, oder nicht leicht lesbar was die Werte die dahinter stehen bedeuten.

Für eine Kommandozeilen-API gibt es in der Standardbibliothek das `argparse`-Modul.

Auf Moduleebene sollten nur Konstanten, Funktionen, und Klassen definiert werden. Der Code der das Hauptprogramm ausmacht, steckt üblicherweise in einer `main()`-Funktion, die mit folgendem Idiom aufgerufen wird:

Code: Alles auswählen

if __name__ == '__main__':
    main()
Dann kann man das Modul sowohl als Programm ausführen, als auch importieren ohne dass die Funktion automatisch ausgeführt wird. Das ist praktisch zum interaktiven Testen von einzelnen Funktionen, und auch für automatisierte Tests, und einige Werkzeuge, zum Beispiel zur Dokumentationserzeugung erwarten auch das man Module ohne Effekte importieren kann.