python - strace 一个 python 函数

标签 python strace

是否可以对打开的文件跟踪 python 函数,并区分它们是由 python 还是子进程打开的?

read_python, read_external = [], []

@strace_read(read_python, read_external)
function test():
    file = open("foo.txt", "r")
    subprocess.call(["cat", "bar.txt"])

for file in read_python:
    print("python:      ", file)
for file in read_external:
    print("external:    ", file)

所以输出如下:

>>> python:      foo.txt
>>> external:    bar.txt

我最感兴趣的是使用装饰器。差异化不是当务之急。

从概念上讲,我最好的猜测是用包装器替换 load_function(open) 的实例......实际上,我不知道,有太多方法可以访问 open.

最佳答案

我会用更简单的方法解决它,但结果相似。而不是弄清楚如何在单个函数上启用 strace:

  1. 像这样创建装饰器:(未经测试)

-

def strace_mark(f):
    def wrapper(*args, **kwargs):
        try:
            open('function-%s-start' % f.__name__, 'r')
        except:
            pass
        ret = f(*args, **kwargs)
        try:
            open('function-%s-end' % f.__name__, 'r')
        except:
            pass
        return ret
  1. strace -e 文件 下运行整个应用程序。
  2. 仅获取调用 open(function-something-start)open(function-something-end) 之间的部分。

如果您执行 strace -f,您将免费获得 python/外部分离。看看pid调用什么函数就可以了。

关于python - strace 一个 python 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36905470/

相关文章:

python - Tensorflow 数据集 - 给定生成器输出 1 个标签的 X 个输入,如何构建批处理?

Python 扩展无法使用library_dirs

python - 如何在文件夹中创建所有 Django 应用程序?

c - uv_write 实际上是异步的吗?

linux - 有什么解决方案可以区分 Ubuntu mmap 中的读或写吗?

php - 如何确保代码在重构后仍然有效(动态语言)

linux - 如何在不杀死被跟踪进程的情况下杀死 strace?

c - 没有 mmap2 系统调用 strace 的内存分配?

c - 修改popen输出并用c语言打印

Python:获取进程中更改的对象的实际值