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

2024-09-28 20:39:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我用python打开了一个文件,里面有以下代码

 s=subprocess.Popen(fileName,shell=True)
 s.wait()
 os.remove(fileName)

无论文件是否关闭,它都直接跳转到操作系统删除(),此时文件尚未关闭。所以得到以下例外。在

^{pr2}$

上面的问题发生在其他机器上,但是在我的机器中,直到文件关闭代码流才出现操作系统删除()

我怎么做子流程.Popen()应等待文件关闭。在


Tags: 文件代码机器trueos流程shellfilename
3条回答

我尝试了以下不同的方法

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)

你可以试试这样的方法:

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

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

....

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

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

例如,如果尝试以这种方式打开Excel电子表格,shell将查找注册表并确定打开电子表格的方法是使用命令行标志运行Excel(如果尚未运行),以防止创建空白工作表,然后向其发送DDE命令,告诉它打开该工作表。然后shell退出,您的wait完成,但文件仍处于打开状态(甚至可能尚未打开)。在

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

可能没有任何简单干净的方法来做你想做的事。我能建议的最好方法是,如果os.remove()调用失败,请使用轮询循环,休眠1秒,然后再试一次,但如果文件在wait()调用完成时尚未打开,则可能仍有问题。在

相关问题 更多 >