0

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

4

3 回答 3

0

在不知道 this 的值的fileName情况下有点猜测,但我相信您的问题是您正在等待 shell 退出,但 shell 会启动另一个进程来打开文件并且不等待该进程退出。

例如,如果您尝试以这种方式打开 Excel 电子表格,shell 将查找注册表并确定打开电子表格的方法是运行带有命令行标志的 Excel(如果尚未运行),以防止它创建空白工作表,然后向它发送一个 DDE 命令,告诉它打开工作表。然后 shell 退出,你wait完成了,但文件仍然打开(或者甚至可能还没有打开)。

如果您想等待完成,您至少需要运行打开文件的实际命令,而不是依赖于 shell 的自动查找。如果应用程序已经在运行,这可能仍然不够,因为某些应用程序可能会检测到现有实例,因此您的等待仅在应用程序尚未运行时才有效。

可能没有任何简单干净的方法来做你想做的事。我可以建议的最好的方法是,如果os.remove()调用失败,您使用轮询循环,休眠 1 秒然后重试,但是如果在wait()调用完成时文件实际上还没有打开,您可能仍然会遇到问题。

于 2013-09-23T08:57:03.543 回答
0

你也许可以尝试这样的事情:

s=subprocess.Popen(fileName,shell=True)

while True:
    try:
        os.remove(filename)
        break
    except(WindowsError):
        time.sleep(1) # wait 1 second

....

此代码段应反复尝试关闭文件。如果它收到 windows 错误,它会等待一秒钟,然后再试一次。

于 2013-09-23T10:26:58.913 回答
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)
于 2013-09-24T04:20:12.513 回答