为什么在python中打开文件后退出Windows命令处理器?
我用python打开了一个文件,代码如下:为什么在python中打开文件后退出Windows命令处理器?,python,shell,subprocess,wait,popen,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 上面的问
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()等待文件关闭。在不知道
fileName
的值的情况下这有点猜测,但我相信您的问题是等待shell退出,但shell启动另一个进程打开文件,而不是等待该进程退出
例如,如果您尝试以这种方式打开Excel电子表格,shell将查找注册表并确定打开电子表格的方式是使用命令行标志运行Excel(如果尚未运行),该标志阻止Excel创建空白工作表,然后向其发送DDE命令,告知其打开工作表。然后shell退出,等待
完成,但文件仍处于打开状态(甚至可能尚未打开)
如果要等待完成,至少需要运行打开文件的实际命令,而不依赖shell的自动查找。如果应用程序已经在运行,这可能仍然不够,因为某些应用程序可能检测到现有实例,因此只有在应用程序尚未运行时,您的等待才会起作用
可能没有任何简单干净的方法来做你想做的事。我最好的建议是,如果
os.remove()
调用失败,请使用轮询循环,休眠1秒,然后重试,但如果在wait()
调用完成时文件尚未实际打开,则可能仍然会有问题。您可以尝试以下操作:
s=subprocess.Popen(fileName,shell=True)
while True:
try:
os.remove(filename)
break
except(WindowsError):
time.sleep(1) # wait 1 second
....
此代码段应反复尝试关闭该文件。如果它收到windows错误,它会等待一秒钟,然后再试一次。我用以下不同的方式进行了尝试
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)
您可能需要
os.startfile(文件名)
或webbrowser.open(文件名)
。您还可以显式指定关联的程序:subprocess.check_call([program,filename])
Hi J.F.Sebastian,我尝试了os.startfile(filename)和webbrowser.open(filename)两种方法。使用这两种方式打开文件,但在这里我们无法跟踪文件何时关闭。通过subprocess.check_调用([program,filename]),我们可以打开文件,还可以在文件关闭时跟踪事件。这在我的系统中运行,但在其他机器中,我无法跟踪文件关闭事件