Python 关闭已终止进程的文件
python:3.4 操作系统:win7/win10 我想用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)
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.