gpt4 book ai didi

python - 有没有办法检查我的代码的哪一部分使文件句柄处于打开状态

转载 作者:行者123 更新时间:2023-12-03 19:40:14 25 4
gpt4 key购买 nike

有没有办法跟踪 python 进程以检查文件的打开位置。我使用 lsof 时打开的文件太多在我的运行过程中,但我不确定它们在哪里被打开。

ls /proc/$pid/fd/ | wc -l
我怀疑我正在使用的库之一可能没有正确处理文件。有没有办法准确地隔离我的 python 代码中正在打开文件的哪一行?
在我的代码中,我使用 3rd 方库来处理数千个媒体文件,并且由于它们处于打开状态,我收到错误
OSError: [Errno 24] Too many open files
运行几分钟后。现在我知道提高打开文件的限制是一种选择,但这只会将错误推到以后的时间点。

最佳答案

追踪 open 的最简单方法调用是在 Python 中使用审计钩子(Hook)。请注意,此方法只会跟踪 Python open调用而不是系统调用。
fdmod.py是具有单个功能的模块文件foo :

def foo():
return open("/dev/zero", mode="r")
现在文件中的主要代码 fd_trace.py ,它正在跟踪所有 open调用和导入 fdmod , 定义如下:
import sys
import inspect
import fdmod

def open_audit_hook(name, *args):
if name == "open":
print(name, *args, "was called:")
caller = inspect.currentframe()
while caller := caller.f_back:
print(f"\tFunction {caller.f_code.co_name} "
f"in {caller.f_code.co_filename}:"
f"{caller.f_lineno}"
)
sys.addaudithook(open_audit_hook)

# main code
fdmod.foo()
with open("/dev/null", "w") as dev_null:
dev_null.write("hi")
fdmod.foo()
当我们运行 fd_trace.py ,我们将在某个组件调用 open 时打印调用堆栈:
% python3 fd_trace.py
open ('/dev/zero', 'r', 524288) was called:
Function foo in /home/tkrennwa/fdmod.py:2
Function <module> in fd_trace.py:17
open ('/dev/null', 'w', 524865) was called:
Function <module> in fd_trace.py:18
open ('/dev/zero', 'r', 524288) was called:
Function foo in /home/tkrennwa/fdmod.py:2
Function <module> in fd_trace.py:20
sys.audithook inspect.currentframe 详情。

关于python - 有没有办法检查我的代码的哪一部分使文件句柄处于打开状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65829719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com