Python:无法从Windows上os.execl调用的Python脚本中删除打开的文件
考虑一下 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
的实例 delfoo.py
能够在不关闭文件的情况下,删除它的前身 lol.py
打开的文件呢?
2 个回答
0
我刚查了一下os.execl*(),发现了这些内容:
当前的进程会被立即替换掉。打开的文件对象和描述符不会被刷新,所以如果这些打开的文件里有数据在缓冲区中,你应该在调用exec*()函数之前,先用sys.stdout.flush()或os.fsync()来刷新它们。
我猜想,除了没有刷新文件对象,它们也没有被关闭。
2
你忘记关闭文件处理器了:
#----lol.py----
import os,sys
f = open("foo.txt","w")
f.write("HI")
f.close() # HERE !
os.execl(sys.executable, sys.executable, "delfoo.py")