简单地检查脚本中的pyc文件,co_name函数存在问题,脚本工作正常,直到编组模块是加载,然后才下降。
magic: 160d0d0a
mod_time: 1493965574
source_size: 231
code:
Traceback (most recent call last):
File "/home/ubuntu/Downloads/book-resources-master/chapter4/code-exec-eg/python/inspect.py", line 24, in <module>
inspect_code(code)
File "/home/ubuntu/Downloads/book-resources-master/chapter4/code-exec-eg/python/inspect.py", line 8, in inspect_code
print('{}{}(line:{})'.format(indent, code.co_names, code.co_firstlineno))
AttributeError: 'float' object has no attribute 'co_names'如果有人能帮忙的话!谢谢
import marshal
import types
def to_long(s):
return s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24)
def inspect_code(code, indent=' '):
print('{}{}(line:{})'.format(indent, code.co_names, code.co_firstlineno))
for c in code.co_consts:
if isinstance(c, types.CodeType):
inspect_code(c, indent + ' ')
f = open('__pycache__/add.cpython-39.pyc', 'rb')
magic = f.read(4)
print('magic: {}'.format(magic.hex()))
mod_time = to_long(f.read(4))
print('mod_time: {}'.format(mod_time))
source_size = to_long(f.read(4))
print('source_size: {}'.format(source_size))
print('\ncode:')
code = marshal.load(f)
inspect_code(code)
f.close()
import dis
dis.disassemble(code)发布于 2021-05-19 22:37:10
我不熟悉marshal模块或pyc内容,但当我使用Python3.9尝试您的代码时,读取代码值时会出现错误。对于用Python3.9构建的示例pyc来说,文件的格式似乎不一样。
magic: 610d0d0a
mod_time: 0 # <---- Unknown
source_size: 1621462747 # <---- Must be mode time当我在读取代码值之前多读4个字节时,我得到了以下结果:
magic: 610d0d0a
mod_time: 0
source_size: 1621462747
4 more bytes: 14 # <----- Must be source size然后我就可以读取代码值:
code:
('print',)(line:1)
1 0 LOAD_NAME 0 (print)
2 LOAD_CONST 0 ('Hello')
4 CALL_FUNCTION 1
6 POP_TOP
8 LOAD_CONST 1 (None)
10 RETURN_VALUE我不知道为什么您能够运行marshal.load()而不出错,但您可以在调用marshal.load(f)之前多读4个字节或少读4个字节吗
https://stackoverflow.com/questions/67611446
复制相似问题