首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AttributeError:'co_names‘对象没有属性’co_names‘

AttributeError:'co_names‘对象没有属性’co_names‘
EN

Stack Overflow用户
提问于 2021-05-19 22:00:07
回答 1查看 218关注 0票数 0

简单地检查脚本中的pyc文件,co_name函数存在问题,脚本工作正常,直到编组模块是加载,然后才下降。

代码语言:javascript
复制
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'

如果有人能帮忙的话!谢谢

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2021-05-19 22:37:10

我不熟悉marshal模块或pyc内容,但当我使用Python3.9尝试您的代码时,读取代码值时会出现错误。对于用Python3.9构建的示例pyc来说,文件的格式似乎不一样。

代码语言:javascript
复制
magic: 610d0d0a
mod_time: 0 # <---- Unknown
source_size: 1621462747 # <---- Must be mode time

当我在读取代码值之前多读4个字节时,我得到了以下结果:

代码语言:javascript
复制
magic: 610d0d0a
mod_time: 0
source_size: 1621462747
4 more bytes: 14 # <----- Must be source size

然后我就可以读取代码值:

代码语言:javascript
复制
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个字节吗

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67611446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档