如何检测python源代码中的I/O(I/O的标准库方法)

2024-09-28 19:24:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为我最后一年的项目为python代码的一小部分构建一个优化编译器。我要做的第一件事是测试一个变量是否与I/O有关或导致I/O。如果我要静态地跟踪一个函数调用到众所周知的“兔子洞”中,我如何确切地知道它涉及I/O?是否会调用内置的python函数(如print、input或内置的“file”对象函数调用)进行读写操作?在

我没有太多的时间来做这个项目(只有6个月),所以我完全忽略了人们用C编写I/O,把它包装成某种python对象并从python调用它。在

生成的字节码是否指示是否存在I/O?还是和AST一样没用?在

如果它是不可撤销的,我将只是我的项目的I/O子集来打印,输入读写。或者做活性分析。在

谢谢。在


Tags: 项目对象函数代码input字节编译器时间
1条回答
网友
1楼 · 发布于 2024-09-28 19:24:08

它不像只查看字节码那么简单,因为对事物的调用只是符号查找:

>>> def write_to_a_file(s):
    f = open('foo.txt', 'w')
    f.write(s)
    f.close()


>>> import dis
>>> dis.dis(write_to_a_file)
  2           0 LOAD_GLOBAL              0 (open)
              3 LOAD_CONST               1 ('foo.txt')
              6 LOAD_CONST               2 ('w')
              9 CALL_FUNCTION            2
             12 STORE_FAST               1 (f)

  3          15 LOAD_FAST                1 (f)
             18 LOAD_ATTR                1 (write)
             21 LOAD_FAST                0 (s)
             24 CALL_FUNCTION            1
             27 POP_TOP             

  4          28 LOAD_FAST                1 (f)
             31 LOAD_ATTR                2 (close)
             34 CALL_FUNCTION            0
             37 POP_TOP             
             38 LOAD_CONST               0 (None)
             41 RETURN_VALUE      

它们自己的字节码只是加载、调用和存储。如果您在字节码级别操作,那么实际上必须查看有效负载。在

Check out the current list of Python bytecodes并且您可以看到实际上没有任何东西可以区分I/O调用。在

即使您要检查所有LOAD_GLOBAL调用或LOAD_FAST调用并应用白名单,也不一定有效,因为有些模块提供I/O,而字节码也不能真正帮助您:

^{pr2}$

注意,shutilLOAD_FAST可以是用户自己编出来的。在我的例子中,我只是使它成为一个通用对象,但是用户的路径上也可以有一个不同的shutil。在

相关问题 更多 >