用Python在Linux中检查打开的文件

13
我想找到一种使用Python确定整个系统(Linux)中打开的文件的方法。我找不到任何可以执行此操作的模块。

或者也许唯一的方法是使用lsof命令?


这个怎么样?http://www.remix.net/blog/?p=130 - hek2mgl
7
“打开的文件”是指被你的进程使用的文件吗?还是指整个系统中打开的文件? - Vitaly Isaev
好吧,你可以查看lsof的源代码并模仿它的做法,只不过用Python实现...但我真的建议使用lsof... - twalberg
2个回答

20

2018年4月更新:对于更近期的psutil版本:

psutil的更新版本现在采用略微不同的函数名称open_files,如下所示,可以在官方文档中查看相关示例:

>>> import psutil
>>> f = open('file.ext', 'w')
>>> p = psutil.Process()
>>> p.open_files()
[popenfile(path='/home/giampaolo/svn/psutil/file.ext', fd=3)]

psutil原始回答/旧版本:

如果你查看 psutil Python 模块的文档(可以在 PyPI 上获得),你会发现有一个检查给定进程中打开文件的方法。你可能想要获取所有活动 PID 的列表,如相关的 stack overflow 响应中所述。然后使用以下方法:

get_open_files() 返回由进程打开的普通文件列表,其中包括文件的绝对路径名和文件描述符。示例:

>>> f = open('file.ext', 'w')
>>> p = psutil.Process(os.getpid())
>>> p.get_open_files()
[openfile(path='/home/giampaolo/svn/psutil/file.ext', fd=3)]

从0.2.1版本开始更改:OSX实现改为C编写,不再需要lsof。 从0.4.1版本开始更改:FreeBSD实现改为C编写,不再需要lsof。

编辑:用于遍历活动PID的psutil还有另一种方法(也在上面的Stack Overflow响应中引用):

psutil.process_iter()

返回一个迭代器,为本地计算机上所有正在运行的进程生成Process类实例。每个新的Process实例仅被创建一次,然后缓存在内部表中,每次使用时会更新该表。


这已经不再有效了。由于 get_open_files 已被移除。您能否更新您的答案并提供任何新函数? - Anirban Nag 'tintinmj'
get_open_files已被弃用,不再可用。 - Sajuuk
1
非常感谢,我已经更新了信息,使用了2018年4月的新“open_files”替换函数。 - treddy
1
这只显示由Python会话打开的进程,而不是整个系统。有没有办法检查htop的输出? - Harsh Patel

0

在 Python 3.7 和 Windows10 下,我已经成功测试了替换 p.get_open_files() 的方法。

   fileList = p.as_dict(attrs=['open_files'])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接