【问题标题】:Finding which files are being read from during a session (python code)查找会话期间正在读取哪些文件(python 代码)
【发布时间】:2022-01-12 07:21:18
【问题描述】:

我有一个用 python 编写的大型系统。当我运行它时,它会从我的文件系统上的许多不同文件中读取各种数据。有数千行代码和数百个文件,其中大多数实际上并没有被使用。我想查看系统(ubuntu)实际访问了哪些文件,并希望查看它们在代码中的哪个位置被打开。文件名是使用变量等动态决定的,因此仅通过查看代码无法确定实际的文件名。 当然,我可以访问代码,并且可以更改它。

我试图弄清楚如何有效地做到这一点,只需对代码进行最小的更改:

  1. 是否有一种 Linux 方法可以确定访问哪些文件以及访问时间?这可能很有用,尽管它不会告诉我发生在代码中的什么位置
  2. 有没有一种简单的方法可以让“打开文件”命令同时记录打开文件的文件名、时间等...?希望不必进入代码并更改每个打开的命令,其中有很多命令,其中一些在运行时没有被使用。

谢谢

【问题讨论】:

    标签: python linux file read-write


    【解决方案1】:

    您可以使用 strace 在不修改代码的情况下跟踪文件访问。 要么你用 strace 启动你的程序,像这样

    strace -f -e trace=file your_program.py
    

    否则,您将 strace 附加到这样的正在运行的程序中

    strace -f -e trace=file -p <PID>
    

    【讨论】:

    • 难以置信。我不知道那个命令。正是我需要的。
    【解决方案2】:

    对于 1 - 你可以使用

    ls -la /proc/<PID>/fd`
    

    &lt;PID&gt; 替换为您的进程ID。 请注意,它会为您提供所有打开的文件描述符,其中一些是 stdin stdout stderr,通常还有其他内容,例如打开的 websockets(使用文件描述符),但是过滤文件应该很容易。

    对于 2- 请参阅此处提出的出色解决方案- Override python open function when used with the 'as' keyword to print anything

    例如用你自己的覆盖 open 函数,这可能包括额外的日志记录。

    【讨论】:

      【解决方案3】:

      一种可能的方法是“重载”open 函数。这将产生许多取决于代码的效果,因此如果需要,我会非常小心地执行此操作,但基本上这里是一个示例:

      >>> _open = open
      >>> def open(filename):
      ...     print(filename)
      ...     return _open(filename)
      ...
      >>> open('somefile.txt')
      somefile.txt
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
        File "<stdin>", line 3, in open
      FileNotFoundError: [Errno 2] No such file or directory: 'somefile.txt'
      

      如您所见,我的新 open 函数将返回原始的 open(重命名为 _open),但会首先打印出参数(文件名)。如果需要,可以更复杂地记录文件名,但最重要的是,这需要在代码中使用 open 之前运行

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-12
        • 1970-01-01
        • 1970-01-01
        • 2011-07-15
        相关资源
        最近更新 更多