python: kan ikke slette åben fil fra os.execl'd python script på windows

Indlæg af Hanne Mølgaard Plasc

Problem



Overvej delfoo.py og dets partner, lol.py:


#----delfoo.py-----
import os
os.unlink("foo.txt")

#----lol.py----
import os,sys

f = open("foo.txt","w")
f.write("HI")
#not closing f on purpose!
os.execl(sys.executable, sys.executable, "delfoo.py")
print "If this line shows, then something is broken."


Indkalder python lol.py udbytter (bemærk den sidste linje blev ikke udskrevet):


C:	mp>python lol.py

C:	mp>Traceback (most recent call last):
  File "delfoo.py", line 2, in <module>
    os.unlink("foo.txt")
WindowsError: [Error 32] The process cannot access the file because it is being
used by another process: 'foo.txt'


Jeg finder det underligt, da os.excel skal erstatte den igangværende proces med en anden. Hvis det er udskiftet, og hvis et program afsluttes, kan man slette filen, selvom den ikke var lukket:


C:	mp>del foo.txt

C:	mp>dir foo.txt
 Volume in drive C has no label.
 Volume Serial Number is 1060-E78D

 Directory of C:	mp

File Not Found


hvorfor kan jeg ikke slette filen fra den nye proces, der har erstattet den forrige? Hvordan kan jeg gøre det sådan, at os.execl d-instansen, delfoo.py, kan fjerne linket til filen, der blev åbnet af sin stamfader, lol.py, uden at lukke nævnte fil?

Bedste reference


Du har glemt at lukke filhåndtereren:


#----lol.py----
import os,sys

f = open("foo.txt","w")
f.write("HI")
f.close() # HERE !
os.execl(sys.executable, sys.executable, "delfoo.py")

Andre referencer 1


Bare tjekker os.execl * () gav mig dette: [12]



  Den nuværende proces er erstattet
  straks. Åbn filobjekter og
  deskriptorer spolas ikke, så hvis
  Der kan være databuffer på disse
  åbne filer, skal du skylle dem
  bruger sys.stdout.flush () eller os.fsync ()
  før du kalder en exec * () -funktion.



Jeg gætter sammen med ikke at skylle filobjektene, de lukkes heller ikke.