ElementTree und Exceptions

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
ws
User
Beiträge: 65
Registriert: Freitag 16. Juni 2006, 13:19

Hallo,

für ein Projekt benutze ich ElementTree, um kleinere XML-Dateien einzulesen. Über Unittests wird ausserdem geprüft, wie die entsprechende Applikation mit ungültigen XML-Dateien umgeht. Leider schlägt das Abräumen
fehl, wenn man ElementTree.parse() eine ungültige Datei übergibt; anscheinend gibt der Parser das dazugehörige Filehandle nicht zurück (Python 2.5, Windows XP, ElementTree 1.2.6). Ich erhalte folgenden Fehler

WindowsError: [Error 32] Der Prozess kann nicht auf die Datei zugreifen, da sie
von einem anderen Prozess verwendet wird: 'bla'

Das Problem lässt sich mit dem unten wiedergegebenen Code reproduzieren. Scheint zunächst mal ein Fehler in ElementTree zu sein, oder? Fällt jemand ein Workaround ein?

Thanx in advance

Wolfgang

Code: Alles auswählen

import os
from xml.etree import ElementTree

f = open("bla", "w")
f.write("")
f.close()
parsed = ElementTree.parse("bla")
os.remove("bla")
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Da ``parse`` und andere Teile der API alternativ zu einem Dateinamen auch ein Dateihandle akzeptieren, sollte dieses helfen:

Code: Alles auswählen

from __future__ import with_statement
import os
from xml.etree import ElementTree


with open("bla", "w") as f:
    f.write("")

with open("bla", "r") as f:
    parsed = ElementTree.parse(f)

os.remove("bla")
midan23
User
Beiträge: 147
Registriert: Sonntag 21. Mai 2006, 21:41
Wohnort: Müchen
Kontaktdaten:

Also, wenn ich mir das kurz anschaue:

1) In dem Code wird die Datei erstellt, eingelesen und gelöscht ...
2) Laut der Fehlermeldung wird die Datei zusätzlich von einem anderen Prozess verwendet ...

Bei mir funktioniert der Code jedenfalls ...
(Ich musste nur eine Zeile Ändern ... Leere Dateien sind keine XML-Dateien ...)
BlackJack

Falls Du die `f.write()`-Zeile geändert hast: Die hat *absichtlich* eine ungültige XML-Datei erzeugt! Das soll so sein!
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Es geht darum, dass ET bei einer ungültigen Datei das Handle wohl nicht geschlossen zu haben scheint.
ws
User
Beiträge: 65
Registriert: Freitag 16. Juni 2006, 13:19

Hi,

vielen Dank für Eure Antworten, insbesondere der Tipp, dass ich parse auch direkt einen Filehandle statt eines Dateinamens übergeben kann, sollte mein Problem lösen.

Gruss
Wolfgang
Antworten