【问题标题】:Check for open files with Python in Linux在 Linux 中使用 Python 检查打开的文件
【发布时间】:2013-12-05 01:15:30
【问题描述】:

我正在寻找一种方法来使用 Python 确定在我的整个系统 (Linux) 中打开了哪些文件。我找不到任何这样做的模块。

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

【问题讨论】:

  • 这个怎么样? remix.net/blog/?p=130
  • 打开的文件是什么意思?您的流程使用的那些?还是在整个系统上打开文件?
  • 好吧,您可以查看lsof 的源代码并执行它的功能,但Python 除外...但我真的只推荐使用lsof...

标签: python linux lsof


【解决方案1】:

自 2018 年 4 月起更新以获取最新版本的 psutil

psutil 的较新版本现在为此使用稍微不同的函数名称,open_files,如以下来自 their docs 的示例所示:

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

原始答案/psutil 的旧版本:

如果您在documentation 中查找 psutil python 模块(可在 PyPI 上使用),您会发现一种方法可以检查给定进程上的打开文件。您可能希望获得related stack overflow response 中描述的所有活动 PID 的列表。然后使用下面的方法:

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 中更改:用 C 重写了 OSX 实现;不再需要lsof。 在 0.4.1 中更改:用 C 重写的 FreeBSD 实现;不再需要 lsof。

编辑:对于活动 PID 的迭代,psutil 有另一种方法(在上述先前的堆栈溢出响应中也引用了该方法):

psutil.process_iter()

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

【讨论】:

  • 这不再有效。由于get_open_files 已被删除。您能否使用任何新功能更新您的答案?
  • get_open_files 已被弃用,不再可用。
  • 非常感谢,截至 2018 年 4 月,我已使用新的 open_files 替换功能更新了信息。
  • 这仅显示由 python 会话打开的进程,而不是整个系统。有什么方法可以检查htop 的输出
猜你喜欢
  • 1970-01-01
  • 2015-09-05
  • 2011-10-13
  • 2013-01-18
  • 2010-12-24
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
相关资源
最近更新 更多