Problem beim Öffnen/ Lesen von Textdateien mit CGI-Script

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
mintpc
User
Beiträge: 50
Registriert: Montag 23. Januar 2012, 12:44

Also, erstmal finde ich es super, dass du mir hilfst. Dann ist hier der Fehler-Code. Er ist aber ziemlich lang und ich wollte
eigentlich niemanden damit belästigen:

Code: Alles auswählen

A problem occurred in a Python script. Here is the sequence of function calls leading up to the error, in the order they occurred.
 /home/www/web4/html/cgi-bin/Tele3run.cgi in ()
   49     Liste =[Nachricht+"\n",str(Zeit)+"\n"]
   50     dat1.writelines(Liste)
   51     LeseListe = dat1.readlines()
   52     print(LeseListe[0])
   53     print(LeseListe[1])  
LeseListe undefined, dat1 = <open file 'Dateien/Halllihalo.txt', mode 'a' at 0x26e66c0>, dat1.readlines = <built-in method readlines of file object at 0x26e66c0>

<type 'exceptions.IOError'>: [Errno 9] Bad file descriptor
      args = (9, 'Bad file descriptor')
      errno = 9
      filename = None
      message = ''
      strerror = 'Bad file descriptor' 
Schonmal danke

mintpc
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Da haben wir es doch (hätte man auch aus dem Code sehen können): Du kannst nicht erst in eine Datei schreiben und auf demselben File-Object dann eine Lese-Operation ausführen!

Im übrigen hattest Du das im ersten Posting auch ganz anders dargestellt!

So musst Du es machen

Code: Alles auswählen

with open(filename, "w") as outfile:
    for line in messages:
        outfile.write(line)
# und dann danach
with open(filename, "r") as infile:
    for line infile:
        print line
Wobei ich mich ja frage, worin der Sinn dabei liegt - wozu die Persistenz in dieser Reihenfolge? *wunder* Du hast ja alle Nachrichten bereits im Speicher vorliegen - wieso willst Du die dann noch mal aus einer Datei laden?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mintpc
User
Beiträge: 50
Registriert: Montag 23. Januar 2012, 12:44

Also, erstmal vielen Dank, auch für den Code und den Hinweis. Da hab ich was, woran ich weiter arbeiten kann. So, wie du das schreibst, steht in dem Python-Buch tatsächlich nichts. Und im Python-Wiki steht auch immer nur ungefähr
mein Codebeispiel.
mintpc hat geschrieben:Wobei ich mich ja frage, worin der Sinn dabei liegt
Na, ich will die Sprache lernen und probiere halt einfach Sachen aus, die dann klappen
oder auch nicht. So lernt man ja ne Sprache am besten, denke ich.

Zumindest hab ich jetzt mit deinem Codestück wieder einen Lernansatz.

Also, dann gute Nacht und nochmal vielen Dank.

mintpc
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mintpc hat geschrieben:
Wobei ich mich ja frage, worin der Sinn dabei liegt
Na, ich will die Sprache lernen und probiere halt einfach Sachen aus, die dann klappen
oder auch nicht. So lernt man ja ne Sprache am besten, denke ich.
Nee, ich meinte die Reihenfolge! ;-)

Und ich will das Buch nicht generell abwerten - ich kenne es ja nicht. Nur diese Stelle scheint mindestens mal unglücklich zu sein.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@mintpc: Vielleicht solltest Du die Sprache erst einmal ohne CGI lernen, denn damit machst Du es Dir nur unnötig komplizierter. Deine hier gezeigten Probleme haben nichts mit CGI zu tun gehabt — die hättest Du bei einem „normal” ausgeführten Skript ganz genau so gehabt. Es wäre nur einfacher gewesen an die Fehlermeldungen heran zu kommen, ohne den Umweg über das Netz, einen Webserver, und dessen Logdateien zu gehen.

Was sich auch wie ein roter Faden durch dieses Thema zieht, ist dass Du ständig Code zeigst, aber die Probleme und Fehlermeldungen von *anderem* Code lieferst. So kann man echt schlecht helfen, wenn man fast sicher sein kann, dass man *nicht* weiss wie Dein Quelltext aussieht. Bei dem gezeigten Quelltext mit Modus 'r+' hätte zum Beispiel keine Ausnahme kommen dürfen. Die Ausnahme, die Du dann gezeigt hast, geht auf Quelltext zurück, der den Modus 'a' verwendet hat.
mintpc
User
Beiträge: 50
Registriert: Montag 23. Januar 2012, 12:44

Na ja, ich finde das etwas zu streng. Ich hab doch jetzt echt was gelernt.

... und bei Python geht es mir ja um die CGI-Geschichte.

Also, nochmal danke an Hyperion und gute Nacht.

mintpc
BlackJack

@mintpc: Die wichtigste Lektion bei CGI ist IMHO das man es nicht (mehr) verwendet. Webanwendungen in Python werden heutzutage in der Regel per WSGI ins Netz gebracht. Und darauf setzt man mindestens ein Mikrorahmenwerk wie Bottle oder Flask.
mintpc
User
Beiträge: 50
Registriert: Montag 23. Januar 2012, 12:44

Aha?!? Kannst du mir denn ein gutes Buch zur Einarbeitung empfehlen.
Von "Rahmenwerk" hab ich gar keine Ahnung, interessiert mich aber.

mintpc
BlackJack

@mintpc: Bottle und Flask haben Webseiten mit Dokumentation. Bücher wird man eher für grössere Rahmenwerke wie Django finden. Andererseits könntest Du auch einfach mal in die Doku für die „kleinen” schauen. Bottle hat ein Tutorial. Flask vielleicht auch…
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben:Flask vielleicht auch…
Hat es - auch ein sehr gutes!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten