sys.argv[1] Prüfen ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
digi
User
Beiträge: 8
Registriert: Freitag 22. August 2008, 20:15
Wohnort: bei Göttingen
Kontaktdaten:

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
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@digi: Du übergibst keinen Kommandzeilenparameter, deshalb ist enthält sys.argv nur ein Element, nämlich den Programmdateinamen.
Benutzeravatar
digi
User
Beiträge: 8
Registriert: Freitag 22. August 2008, 20:15
Wohnort: bei Göttingen
Kontaktdaten:

Ja genau deshalb wollte ich die IF Verzweigung machen und einen Text ausgeben wenn kein Parameter übergeben wird.

mfg
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.
Antworten