如何查找Ubuntu下Python程序运行时访问的文件及对应代码位置
解决方案
1. Linux系统层面的文件访问监控方法
不需要修改任何代码,直接通过系统工具捕获进程的文件访问行为:
- strace 系统调用跟踪
直接在启动程序时加上strace前缀,捕获所有文件打开操作:
参数说明:strace -e trace=open,openat -tt -o access_log.txt python your_main_script.py-e trace=open,openat只跟踪文件打开相关的系统调用,过滤无关信息-tt输出精确到微秒的访问时间戳-o access_log.txt把结果输出到日志文件方便后续分析
如需过滤系统库、动态链接文件等无关记录,可以执行:
即可得到业务相关的文件访问记录。grep -v '\.so\|\.pyc\|/usr/' access_log.txt - /proc 进程文件描述符查询
适合长时间运行的后台服务,程序启动后执行:
可以实时查看当前进程打开的所有文件句柄对应的路径。ls -l /proc/$(pgrep -f "python your_main_script.py")/fd
2. Python层面自动记录open操作的方案
仅需在程序入口添加少量代码,无需修改任何业务逻辑里的open调用:
通过猴子补丁替换内置open函数的方式实现全局日志记录,在你程序的入口文件(比如main.py)的最开头添加以下代码:
import builtins import time import inspect # 备份原始open函数 _raw_open = builtins.open def _logging_open(*args, **kwargs): # 提取文件名 file_path = args[0] if len(args) > 0 else kwargs.get("file", "unknown_path") # 获取调用open的代码位置 caller = inspect.stack()[1] call_pos = f"{caller.filename}:{caller.lineno}" # 输出日志,可替换为写入日志文件逻辑 print( f"[OPEN {time.strftime('%Y-%m-%d %H:%M:%S.%f')}] " f"Path: {file_path} | Caller: {call_pos}", flush=True ) # 执行原始open逻辑 return _raw_open(*args, **kwargs) # 全局替换内置open builtins.open = _logging_open
如果你的代码中使用了pathlib.Path.open()方法打开文件,额外添加以下补丁即可:
from pathlib import Path _raw_path_open = Path.open def _logging_path_open(self, *args, **kwargs): caller = inspect.stack()[1] call_pos = f"{caller.filename}:{caller.lineno}" print( f"[OPEN {time.strftime('%Y-%m-%d %H:%M:%S.%f')}] " f"Path: {self.absolute()} | Caller: {call_pos}", flush=True ) return _raw_path_open(self, *args, **kwargs) Path.open = _logging_path_open
该方案会记录所有open调用的文件路径、访问时间、代码调用位置,完全不需要修改业务代码中的open语句。
内容的提问来源于stack exchange,提问作者amit
相关产品推荐
相关产品推荐

