我使用以下代码在python中打开了一个文件,
s=subprocess.Popen(fileName,shell=True)
s.wait()
os.remove(fileName)
文件是否关闭,它直接跳转到os.remove(),到那时文件没有关闭。因此得到以下异常。
WindowsError: [Error 32] The process cannot access the file because it is being used by another process
上面的问题出现在其他机器上,但在我的机器中,直到文件关闭,代码流程才会到达os.remove()
如何使subprocess.Popen()等到文件关闭。
答案 0 :(得分:0)
在不知道fileName
的值的情况下这是一个猜测,但我相信你的问题是你正在等待shell退出,但是shell启动了另一个进程来打开文件并且没有'等待该进程退出。
例如,如果您尝试以这种方式打开Excel电子表格,shell将查找注册表并确定打开电子表格的方法是使用命令行标志运行Excel(如果尚未运行),以防止它创建一个空白工作表,然后发送一个DDE命令告诉它打开工作表。然后shell退出,wait
完成,但文件仍然打开(或者甚至可能尚未打开)。
如果你想等待完成,你至少需要运行打开文件的实际命令,而不是依赖shell的自动查找。如果应用程序已经在运行,那可能仍然不够,因为某些应用程序可能会检测到现有实例,因此只有在应用程序尚未运行时,您的等待才会起作用。
可能没有任何简单的干净方法可以做你想要的。我可以建议的最好的是,如果os.remove()
调用失败,则使用轮询循环,休眠1秒钟然后重试,但如果文件实际上尚未打开,则可能仍然有问题wait()
来电完成。
答案 1 :(得分:0)
您可以尝试这样的事情:
s=subprocess.Popen(fileName,shell=True)
while True:
try:
os.remove(filename)
break
except(WindowsError):
time.sleep(1) # wait 1 second
....
此代码段应反复尝试关闭文件。如果它出现Windows错误,它会在再次尝试之前等待一秒钟。
答案 2 :(得分:0)
我尝试了以下不同的方式,
def removeTempFile(tempFileName):
f = None
while f == None:
try:
f=open(tempFileName,'w')
f.close()
except Exception as e:
print "already open"
f=None
time.sleep(2)
os.remove(tempFileName)