import re
import subprocess
_handle_pat = re.compile(r'(.*?)\s+pid:\s+(\d+).*[0-9a-fA-F]+:\s+(.*)')
def open_files(name):
"""return a list of (process_name, pid, filename) tuples for
open files matching the given name."""
lines = subprocess.check_output('handle.exe "%s"' % name).splitlines()
results = (_handle_pat.match(line.decode('mbcs')) for line in lines)
return [m.groups() for m in results if m]
2条答案
按热度按时间0lvr5msh1#
您可以使用Microsoft的handle.exe命令行实用程序。例如:
注意,对于Unicode文件名,这是有限制的。在Python 2中,子进程将
name
作为ANSI字符串传递,因为它调用CreateProcessA
而不是CreateProcessW
。在Python 3中,名称作为Unicode传递。在这两种情况下,handle.exe都使用有损的ANSI编码写入其输出,因此结果元组中匹配的文件名可能包含最适合的字符和“?”替换。3xiyfsfu2#
请不要删除这个答案,以防我做错了什么,但给予我一个机会,通过留下评论来纠正它。谢谢!
有一个比遍历所有PID更好的方法(如评论中所建议的),它涉及到执行Windows API调用来确定给定文件上的所有句柄。请在下面找到我已经发布的另一个问题的代码示例(但是,不能标记为重复,因为它没有任何可接受的答案)。请注意,这只适用于Windows。