关闭已杀死进程的文件

时间:2017-07-18 08:53:56

标签: python

python:3.4

操作系统:win7 / win10

我想用python杀死正在运行的进程并关闭它打开的所有文件:

for proc in psutil.process_iter():
    if proc.name() == 'myprocess.exe':
        opened = proc.open_files()
        proc.kill()
        for i in opened:
            print(i.path)
            io.FileIO(i.path).close()
            print(io.FileIO(i.path).closed)

不知怎的io.IOBase(i.path).close()不起作用。

说明:

这就像我想用python杀死Microsoft Word,但它会打开一些文件。我也想关闭这些文件。

Microsoft Word就是一个例子。这是一个自编的python程序。打开的文件是:

  • fonts(.ttf)
  • clr.pyd
  • 和.dll-s

我该如何关闭这些文件?

3 个答案:

答案 0 :(得分:4)

您无需关闭该进程打开的所有文件。完成automatically

  

终止进程有以下结果:

     
      
  • 流程中的所有剩余线程都标记为终止。
  •   
  • 释放该流程分配的所有资源。
  •   
  • 关闭所有内核对象。
  •   
  • 将从内存中删除进程代码。
  •   
  • 设置了流程退出代码。
  •   
  • 发出过程对象的信号。
  •   

重要的一点是“所有内核对象都已关闭”。对于每个打开的文件句柄,都有一个关联的内核对象 - 实际上是一个句柄,一个从数字到内核对象的映射。当进程退出时,内核将向后移动并关闭所有相关的文件句柄,套接字等。

另外,你原来的方法有一些问题。首先,打开文件列表只是当时打开的文件的快照。在询问打开文件列表和终止进程之间,该进程可以打开更多,或者关闭并删除许多文件。其次,Python 3文档说IOBase的构造函数不是公共的,所以以这种方式使用它是wrong

  

class io.IOBase

     

所有I / O类的抽象基类,作用于字节流。没有公共构造函数。

通常,你会使用io.open()这样的路径。这导致了第三个问题。你必须要做的就是路径。为了关闭文件,你真的需要句柄。这些句柄是特定于进程的。这意味着在一个过程中,0x55​​55AAAA可能对应于“file1.txt”,但在另一个过程中,它可能对应于“file2.txt”或者甚至根本不对应文件(它可能是套接字或其他内容)。因此,即使你有内核句柄,我们也没有办法说“在这个其他过程的上下文中关闭这个句柄”。这违反了流程的一些安全目标。此外,这意味着你在这里实际做的是创建自己的句柄,只转身并关闭它(或者在这种情况下,它可能什么都不做,因为没有正确创建对象)。

所以,如果你的文件仍然存在问题,也许问题是在尝试完成所需的任何工作之前,该过程实际上并没有死亡。如果有进程正在使用的文件要再次使用,则可能需要等待进程退出然后再尝试继续。您似乎可以使用psutils.wait_procs()来执行此操作。

此外,在Windows上,我发现反病毒工具经常会受到阻碍。它们保存了应用程序访问的打开文件,使得当它实际上是病毒扫描程序正在执行其操作时,它看起来仍然是一个进程。我记得在Subversion中必须处理这个问题的一个例子。代码仍然存在today。所以你可能需要稍等一下再试一次。

<强>更新

  

Microsoft Word就是一个例子。这是一个自编的python程序。打开的文件是:

     
      
  • fonts(.ttf)
  •   
  • clr.pyd
  •   
  • 和.dll-s
  •   
     

我该如何关闭这些文件?

答案是你不应该这样做。只需确保该过程实际已退出。这不是一个瞬时操作,所以在杀死它之间有一段时间它实际上已经退出它仍然保留了文件句柄。

鉴于你实际上已经编写了被杀的进程,我认为更好的方法是引入一种方法来启动该进程,让它完成它的工作,然后优雅地退出。然后使用subprocess.run()运行脚本并等待它退出。

答案 1 :(得分:2)

  

这就像我想用python杀死Microsoft Word,但它会打开一些文件。我也想关闭这些文件。

这里有一些误解。当您使用kill终止Word时,从系统的角度来看,所有文件都将关闭,但它们将脏关闭。当Word正常终止时,它会刷新其内部缓冲区,删除所有临时文件并将文件标记为 clean 。当它崩溃或突然终止时,不会发生所有清洁。某些修改可能无法写入磁盘,并且临时文件仍然存在,因此在下次执行时,Word将警告您文件尚未按顺序关闭并且必须进行修复。

因此,您不希望 kill Microsoft Word,而是关闭它,这意味着将WM_QUIT消息发布到其主窗口。不幸的是,Python没有干净利落的支持。有一个通过win32com模块here关闭Excel的示例。 Word的转换应该(注意未经测试):

wd = win32com.client.Dispatch("Word.Application")
wd.Quit() #quit word, as if user hit the close button/clicked file->exit.

答案 2 :(得分:0)

查看with语句语法。这是一个简短的概述here