marshal.loads函数不会将* .pyc内容加载到代码对象

时间:2014-08-04 19:40:23

标签: python python-2.7 python-3.x

我在Python 3.3中尝试这个。

f = open(r'somewhere\my_module.pyc','rb')
contents = f.read()
f.close()

code_obj = marshal.loads(contents[8:])

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: bad marshal data (unknown type code) 

我收到错误,因此我将contents变量类型转换为str

def bytes2str(byte_seq):
    str_seq = ''
    for b in byte_seq:
        str_seq += chr(b)
    return str_seq

contents = bytes2str(contents)
code_obj = marshal.loads(contents[8:])

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' does not support the buffer interface

当我在Python 2.7中尝试这个时,我得到一个代码对象。如何在不使用compile内置函数的情况下处理此问题?

1 个答案:

答案 0 :(得分:2)

似乎.pyc文件的标题在最近的Python版本中已更改为12个字节,而不是8.如果执行code_obj = marshal.loads(contents[12:]),您将获得代码对象正在寻找。

我徒劳地试图找到PYC文件格式的更改文档,但到目前为止我没有运气。它似乎从Python 3.3开始(其中包括对导入机制进行了大量更改),但我不确定哪个位需要额外的4个字节。