【问题标题】:Finding which files are being read from during a session (python code)查找会话期间正在读取哪些文件(python 代码)
【发布时间】:2022-01-12 07:21:18
【问题描述】:
我有一个用 python 编写的大型系统。当我运行它时,它会从我的文件系统上的许多不同文件中读取各种数据。有数千行代码和数百个文件,其中大多数实际上并没有被使用。我想查看系统(ubuntu)实际访问了哪些文件,并希望查看它们在代码中的哪个位置被打开。文件名是使用变量等动态决定的,因此仅通过查看代码无法确定实际的文件名。
当然,我可以访问代码,并且可以更改它。
我试图弄清楚如何有效地做到这一点,只需对代码进行最小的更改:
- 是否有一种 Linux 方法可以确定访问哪些文件以及访问时间?这可能很有用,尽管它不会告诉我发生在代码中的什么位置
- 有没有一种简单的方法可以让“打开文件”命令同时记录打开文件的文件名、时间等...?希望不必进入代码并更改每个打开的命令,其中有很多命令,其中一些在运行时没有被使用。
谢谢
【问题讨论】:
标签:
python
linux
file
read-write
【解决方案1】:
您可以使用 strace 在不修改代码的情况下跟踪文件访问。
要么你用 strace 启动你的程序,像这样
strace -f -e trace=file your_program.py
否则,您将 strace 附加到这样的正在运行的程序中
strace -f -e trace=file -p <PID>
【解决方案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 之前运行