我想找到一种使用Python确定整个系统(Linux)中打开的文件的方法。我找不到任何可以执行此操作的模块。
或者也许唯一的方法是使用lsof命令?
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'htop
的输出? - Harsh Patel在 Python 3.7 和 Windows10 下,我已经成功测试了替换 p.get_open_files() 的方法。
fileList = p.as_dict(attrs=['open_files'])
lsof
的源代码并模仿它的做法,只不过用Python实现...但我真的建议使用lsof
... - twalberg