为什么在python中打开文件后退出Windows命令处理器?

时间:2013-09-23 07:29:36

标签: python shell subprocess wait popen

我使用以下代码在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()等到文件关闭。

3 个答案:

答案 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)