python: невозможно удалить открытый файл из скрипта python os.execl'd на windows - PullRequest
2 голосов
/ 16 февраля 2011

Рассмотрим delfoo.py и его партнера 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."

Вызов python lol.py выходов (обратите внимание, что последняя строка не печаталась):

C:\tmp>python lol.py

C:\tmp>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'

Я нахожуэто странно, поскольку os.excel должен заменить текущий запущенный процесс другим.Если он заменен, и если после завершения программы можно удалить файл, даже если он не был закрыт:

C:\tmp>del foo.txt

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

 Directory of C:\tmp

File Not Found

, почему я не могу удалить файл из нового процесса, который заменилПредыдущая?Как сделать так, чтобы экземпляр os.execl d, delfoo.py, мог отсоединить файл, открытый его предшественником, lol.py, не закрывая указанный файл?

Ответы [ 2 ]

2 голосов
/ 16 февраля 2011

Вы забыли закрыть обработчик файла:

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

f = open("foo.txt","w")
f.write("HI")
f.close() # HERE !
os.execl(sys.executable, sys.executable, "delfoo.py")
0 голосов
/ 16 февраля 2011

Просто проверка os.execl * () дала мне это:

Текущий процесс заменен немедленно. Открытые файловые объекты и дескрипторы не сбрасываются, поэтому если на этих буферах могут быть данные открыть файлы, вы должны очистить их используя sys.stdout.flush () или os.fsync () перед вызовом функции exec * ().

Я предполагаю, что, не стирая файловые объекты, они также не закрываются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...