Tempfile kann nach Benutzung nicht mehr gelöscht werden.

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
knumskull
User
Beiträge: 34
Registriert: Dienstag 29. September 2009, 08:07
Kontaktdaten:

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
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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)
knumskull
User
Beiträge: 34
Registriert: Dienstag 29. September 2009, 08:07
Kontaktdaten:

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
Zuletzt geändert von knumskull am Dienstag 29. September 2009, 09:35, insgesamt 1-mal geändert.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

welche Version nutzt du?

``with`` ist erst ab 2.6 (bzw. mit ``__from__ future import with_statement`` ab 2.5) verfügbar
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

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).
knumskull
User
Beiträge: 34
Registriert: Dienstag 29. September 2009, 08:07
Kontaktdaten:

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
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich denke schon.
knumskull
User
Beiträge: 34
Registriert: Dienstag 29. September 2009, 08:07
Kontaktdaten:

okay, dann werd ich beim nächsten mal einfach daran zurückdenken :)

Danke & Gruß
Steffen
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Du kannst beim nächsten Mal auch einfach die Doku (aufmerksamer) lesen. :twisted: ;)
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Benutz doch einfach TemporaryFile() oder NamedTemporaryFile(). Wenn du das Dateiobjekt, das du bekommst, dann schließt, wird die Datei automatisch entfernt.
knumskull
User
Beiträge: 34
Registriert: Dienstag 29. September 2009, 08:07
Kontaktdaten:

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?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nein, das siehst du richtig. Wenn du die Datei nicht nur innerhalb deines Programms brauchst, ist das keine Alternative.
Antworten