Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.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 关闭已终止进程的文件_Python - Fatal编程技术网

Python 关闭已终止进程的文件

Python 关闭已终止进程的文件,python,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)

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一样,但它会留下一些打开的文件。我也想关闭这些文件

微软Word就是一个例子。这是一个自行编写的python程序。打开的文件包括:

  • 字体(.ttf)
  • clr.pyd
  • 和.dll-s

我应该如何关闭这些文件?

查看带有语句语法的
。这里有一个简短的概述

看看带有
语句语法的
。这里有一个简要概述

您不需要关闭该进程打开的任何文件。这样做:

终止进程会产生以下结果:

  • 进程中的所有剩余线程都标记为终止
  • 进程分配的任何资源都将被释放
  • 所有内核对象都是关闭的
  • 进程代码将从内存中删除
  • 已设置进程退出代码
  • 进程对象已发出信号
重要的一点是“所有内核对象都是关闭的”。对于每个打开的文件句柄,都有一个相关的内核对象——这实际上就是句柄,一个从数字到内核对象的映射。当进程退出时,内核将退出并关闭所有相关的文件句柄、套接字等

此外,您最初的方法还存在一些问题。首先,打开的文件列表只是当时打开的文件的快照。在请求打开的文件列表和终止进程之间,进程可以打开更多的文件,或者关闭并删除许多文件。第二,Python 3文档说IOBase的构造函数不是公共的,因此以这种方式使用它是:

类io.IOBase

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

通常,您会使用类似于
io.open()
的东西,它采用路径。这就引出了第三个问题。你所要做的就是使用路径。要关闭文件,您确实需要句柄。这些句柄是特定于进程的。这意味着在一个进程中,0x5555AAAA可能对应于“file1.txt”,但在另一个进程中,它可能对应于“file2.txt”,甚至可能根本不是文件(它可能是套接字或其他东西)。因此,即使你有内核句柄,我们也没有办法说“在另一个进程的上下文中关闭这个句柄”,这违反了进程的一些安全目标。此外,这意味着您在这里实际要做的是创建自己的句柄,以便只翻转并关闭它(或者在本例中,由于对象创建不正确,它可能什么也不做)

因此,如果您对仍保留的文件有问题,那么问题可能在于,在尝试您需要完成的任何工作之前,该过程实际上还没有结束。如果进程正在使用的文件中有您想再次使用的文件,您可能需要等待进程退出,然后再尝试继续。看起来您可以使用
psutils.wait\u procs()
来执行此操作

另外,在Windows上,我发现反病毒工具常常会妨碍我。它们保存应用程序访问的打开的文件,使其看起来像是一个进程仍在保存它们,而实际上是病毒扫描程序在做它的事情。我记得有一次在Subversion中必须处理这个问题。代码仍然存在。因此,您可能需要稍等片刻,然后再试一次

更新

微软Word就是一个例子。这是一个自行编写的python程序。打开的文件包括:

  • 字体(.ttf)
  • clr.pyd
  • 和.dll-s
我应该如何关闭这些文件

答案是你不需要这么做。只需确保进程已实际退出即可。它不是一个即时操作,所以在杀死它和它实际退出之间有一段时间,它仍然保留文件句柄


考虑到您实际上已经编写了要终止的流程,我认为更好的方法是引入一种方法来启动该流程,让它完成工作,然后优雅地退出。然后使用运行脚本并等待它退出。

您不需要关闭进程打开的任何文件。这样做:

终止进程会产生以下结果:

  • 进程中的所有剩余线程都标记为终止
  • 进程分配的任何资源都将被释放
  • 所有内核对象都是关闭的
  • 进程代码将从内存中删除
  • 已设置进程退出代码
  • 进程对象已发出信号
重要的一点是“所有内核对象都是关闭的”。对于每个打开的文件句柄,都有一个相关的内核对象——这实际上就是句柄,一个从数字到内核对象的映射。当进程退出时,内核将退出并关闭所有相关的文件句柄、套接字等

此外,您最初的方法还存在一些问题。首先,打开的文件列表只是当时打开的文件的快照。在请求打开的文件列表和终止进程之间,进程可以打开更多的文件,或者关闭并删除许多文件。第二,Python 3文档说IOBase的构造函数不是公共的,因此以这种方式使用它是:

类io.IOBase

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

通常,您会使用类似于
io.open()
的东西,它采用路径。这就引出了第三个问题。你所要做的就是使用路径
wd = win32com.client.Dispatch("Word.Application")
wd.Quit() #quit word, as if user hit the close button/clicked file->exit.