mikrocontroller.net

Forum: PC-Programmierung file.close() Funktion - not defined


Autor: Gargamel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

In einem Python Script wird eine Datei geöffnet, Daten hinzugefügt und 
wenn das Programm geschlossen wird soll auch die Datei wieder 
geschlossen werden. Das HInzufügen von Daten funktioniert, das SChließen 
allerdings nicht, es erscheint die Meldung "global name 'datei' not 
defined"



import atexit


def exit_handler():
  datei.close()


def step_one():
  datei.write("irgendwelchedaten")
  ...


def main():
  atexit.register (exit_handler)
  datei = open ("file.txt","a")
  ...

Autor: imonbln (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
In dem von dir gezeigten Code  ist datei in jeder Funktion einen eigene 
Variable die nichts miteinander zu tun haben, die Frage welche du 
beantworten solltest ist also eher warum das Datei Write in step_one 
klappt.

Abgesehen davon wird von den meisten erfahrenen Python Entwicklern 
empfohlen das open als contextmanager zu verwenden. dann wird das Close 
beim verlassen des Context automatisch ausgeführt, auch im Fehlerfall.
with open ("file.txt","a") as file:
    step_one(file)
    ...

Ausserdem im  atexit noch eine Datei schließen zu wollen ist zwar 
löblich aber Zu spät. Direkt nach dem atexit kommt das OS und gibt die 
Ressourcen des Beendeten Prozess so wie so frei, dazu gehört auch das 
schließen der Datei.

Generell sollte man bei einen Software Desgin immer versuchen die 
Ressourcen an der gleichen Stelle frei zu geben, an der sie Angefordert 
werden. Es gibt ausnahmen von der Regel aber das ist (wahrscheinlich) 
keine.

Autor: Gargamel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab nun einige Tests gemacht.
Die datei.close() Funktion führt nur zu einem Fehler, wenn sie durch 
atexit aufgerufen wird.

Ich nehme an, dass der Keyboard interrupt an sich oder der dadurch 
ausgelöste atexit u.A. bereits offene Dateien schließt bevor dann zu 
exit.handler() verwiesen wird.

Autor: imonbln (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gargamel schrieb:
> Ich nehme an, dass der Keyboard interrupt an sich oder der dadurch
> ausgelöste atexit u.A. bereits offene Dateien schließt bevor dann zu
> exit.handler() verwiesen wird.

Und damit unterliegst du einen Irrtum! Ein Interrupt der dir File 
Handles schließt ist ziemlich kaputt und sollte gefixet werden! Was bei 
dein Code das Problem ist kann ich dir mit den paar Zeilen die du 
gepostet hast nicht sagen , aber der Keyboard Interrupt schließt keine 
Dateien und du solltest statt mit aexit rum zu Doktoren besser das open 
als Context manager nutzen dann sind deine Problem weg.


Falls du mir das mit den Keyboard Interrupt nicht glaubst, denn kann man 
fangen und folgendes Programm sollte wenn du recht hast das datei.write 
in der letzten zeile nicht mehr ausführen können
if __name__ == "__main__":
    with open('bla.txt', 'a') as datei:
        try:
            while True:
                time.sleep(2)
                print('Hallo', file=datei)
        except KeyboardInterrupt:
            print('This is the end', file=datei)
        datei.write("that's all folks\n") # hier das geht! 

und auf das schreiben im atexit klappt wenn trotz Keyboard interrupt.
Der Unterschied ist nur meine Variable datei ist global bei deiner weiss 
ich es nicht.
import time
import atexit

datei = open('bla2.txt', 'a')

def exit_handler():
  datei.write("that's all folks\n")
  datei.close()

if __name__ == "__main__":
    atexit.register(exit_handler)
    try:
        while True:
            time.sleep(2)
            print('Hallo', file=datei)
    except KeyboardInterrupt:
        print('This is the end', file=datei)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.