Python:无法从Windows上os.execl调用的Python脚本中删除打开的文件

2 投票
2 回答
3455 浏览
提问于 2025-04-16 11:54

考虑一下 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")

撰写回答