我在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
内置函数的情况下处理此问题?
答案 0 :(得分:2)
似乎.pyc
文件的标题在最近的Python版本中已更改为12个字节,而不是8.如果执行code_obj = marshal.loads(contents[12:])
,您将获得代码对象正在寻找。
我徒劳地试图找到PYC文件格式的更改文档,但到目前为止我没有运气。它似乎从Python 3.3开始(其中包括对导入机制进行了大量更改),但我不确定哪个位需要额外的4个字节。