Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在python中打开文件后退出Windows命令处理器?_Python_Shell_Subprocess_Wait_Popen - Fatal编程技术网

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

为什么在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 上面的问

我用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()等待文件关闭。

在不知道
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]),我们可以打开文件,还可以在文件关闭时跟踪事件。这在我的系统中运行,但在其他机器中,我无法跟踪文件关闭事件