You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查找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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:24:04