Seite 1 von 1

Tempfile kann nach Benutzung nicht mehr gelöscht werden.

Verfasst: Dienstag 29. September 2009, 08:27
von knumskull
Hallo,

ich habe ein kleines Problem mit einer Temp-Datei. Ich erzeuge ein Tempfile, befülle dies mit Inhalt, speichere mir den Dateinamen und schließe die Datei.

Danach verwende ich die Datei als Inputdatei in einem anderen Programm, welches mittels Subprocess ausgeführt wird. Bis dahin läuft alles wunderbar.

Jedoch würde ich gern die Datei nach erfolgreicher Abarbeitung mit dem anderen Programm wieder löschen. Jedoch bekomme ich dann untenstehende Fehlermeldung.

Code: Alles auswählen

def f_deltempfile(datei):
	befehl = 'more ' + datei
	prozess = subprocess.Popen(befehl, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
	(std_ausgabe, std_fehler) = prozess.communicate()
	if (std_ausgabe):
		print std_ausgabe
	if (std_fehler):
		print std_fehler
	try:
		os.remove(datei)
	except WindowsError, err:
		print 'Fehler:',err

Code: Alles auswählen

import tempfile
import subprozess
file = tempfile.mkstemp(suffix='.j', prefix='foo_', dir=os.getcwd(),text=True)
journalfile = open(file[1],'wb+')
journalfile.write('4\n')
journalfile.write('3\n')
journalfile.write('2\n')
journalfile.write('1\n')
filename = journalfile.name
journalfile.close()

Code: Alles auswählen

f_deltempfile(filename)
4
3
2
1

Fehler: [Error 32] Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird: 'D:\\Temp\\foo_21ua5o.j'
hat da jemand eine Idee? Oder kann (sollte) ich das ganze irgendwie anders realisieren?
Der Rest läuft alles sauber, nur das löschen der Datei schlägt fehl.

bin dankbar für jeden Tipp, sowie für eine Erklärung, woher dieser Fehler kommt.

Gruß,
Steffen

Verfasst: Dienstag 29. September 2009, 09:11
von snafu
Ich glaub, du hast das etwas falsch verstanden. Die Funktion gibt einen Dateihandler zurück. Du sollst nicht den Dateinamen zum nochmaligen Öffnen benutzen. Es ist also eher so gedacht:

Code: Alles auswählen

from os import fdopen, remove
from tempfile import mkstemp

fd, filename = mkstemp()

with fdopen(fd, 'w') as journalfile:
    journalfile.write('4\n3n\2\n1\n')

remove(filename)

Verfasst: Dienstag 29. September 2009, 09:29
von knumskull
okay, das macht sinn.

Jetzt bekomme ich einen Syntaxerror

Code: Alles auswählen

	(fd, filename) = mkstemp(suffix='.j', prefix=JobName+'_'+Tesselierungsgrad+'_', dir=os.getcwd(),text=True)

	with fdopen(fd, 'w') as journalfile:
		journalfile.write('create unloadfile\n')
		journalfile.write('edit autostitch createnewmodel true\n')

Code: Alles auswählen

with fdopen(fd, 'w') as journalfile:
          ^
SyntaxError: invalid syntax

Verfasst: Dienstag 29. September 2009, 09:33
von jbs
welche Version nutzt du?

``with`` ist erst ab 2.6 (bzw. mit ``__from__ future import with_statement`` ab 2.5) verfügbar

Verfasst: Dienstag 29. September 2009, 09:35
von Pekh
Ich tippe mal auf eine Python-Version < 2.6 :)

Du könntest versuchen, folgendes ganz am Anfang deines Skripts einzufügen:

Code: Alles auswählen

from __future__ import with_statement
Funktioniert das nicht, solltest du entweder deine Python-Version aktualisieren oder aber das 'with' rausschmeissen und klassisch 'öffnen' (also so, wie du es vorher gemacht hast).

Verfasst: Dienstag 29. September 2009, 09:40
von knumskull
Python 2.5.1

ich teste das gerade mal mit dem future-import

*edit

es klappt. Danke für die Tipps.

Kann man sagen, dass mein Problem daran lag, da ich die Datei mit dem Dateinamen geöffnet habe und nicht mit dem file-descriptor?

Gruß,
Steffen

Verfasst: Dienstag 29. September 2009, 09:56
von snafu
Ich denke schon.

Verfasst: Dienstag 29. September 2009, 11:09
von knumskull
okay, dann werd ich beim nächsten mal einfach daran zurückdenken :)

Danke & Gruß
Steffen

Verfasst: Dienstag 29. September 2009, 12:40
von snafu
Du kannst beim nächsten Mal auch einfach die Doku (aufmerksamer) lesen. :twisted: ;)

Verfasst: Dienstag 29. September 2009, 15:41
von str1442
Benutz doch einfach TemporaryFile() oder NamedTemporaryFile(). Wenn du das Dateiobjekt, das du bekommst, dann schließt, wird die Datei automatisch entfernt.

Verfasst: Mittwoch 30. September 2009, 11:41
von knumskull
str1442 hat geschrieben:Benutz doch einfach TemporaryFile() oder NamedTemporaryFile(). Wenn du das Dateiobjekt, das du bekommst, dann schließt, wird die Datei automatisch entfernt.
Ich glaube du hast mein Problem nicht ganz richtig gelesen.
Ich benötige den Inhalt der Temporären Datei als Eingabedaten für ein externes Programm. Wenn ich die Datei beschrieben habe und schließe ist es ja schon wieder weg, das bringt mir ja gar nix. Oder sehe ich das falsch?

Verfasst: Mittwoch 30. September 2009, 12:21
von cofi
Nein, das siehst du richtig. Wenn du die Datei nicht nur innerhalb deines Programms brauchst, ist das keine Alternative.