从python代码执行字节码.pyc?

时间:2018-06-08 20:42:03

标签: python assembly

我有一个声明函数和徽标的字节码文档。我还有一个.py文件,我调用字节码来输出函数中的徽标和字符串。我如何实际执行字节码?我能够拆开它并查看汇编代码。我怎么能真正运行它?

question.py

import dis
import logo
def work_here():
    # execute the bytecode

def main():
    work_here()

if __name__ == '__main__':
    main()

2 个答案:

答案 0 :(得分:0)

尝试类似:

import dis

code = 'some byte code'

b_code = dis.Bytecode(code)

exec(b.codeobj)

答案 1 :(得分:0)

要导入.pyc文件,您只需对.py文件执行相同的操作:import spam会找到适当放置的spam.pyc(或者更确切地说,像__pycache__/spam.cpython-36.pyc这样的东西就像找到一个适当放置的spam.py一样。它的顶级代码运行,任何函数和类都被定义,所以你可以调用它们等,与.py文件完全相同;唯一的区别是没有源文本显示回溯或调试器步进等。

如果要以编程方式通过显式路径导入.pyc文件,或者在不导入文件的情况下执行一个文件,则再次执行与.py文件相同的操作。

查看importlib中的Examples。例如:

path = 'bytecoderepo/myfile.pyc'
spec = importlib.util.spec_from_file('myfile', path)
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)

现在,bytecoderepo/myfile.pyc中的代码已经执行,结果模块在变量mod中可用,但它不在sys.modules中或存储为全球性的。

如果你真的需要深入研究.pyc格式,例如,提取一些函数的字节码,这样你可以exec它(或者从中构建一个函数对象)而不执行main模块代码,细节只记录在源代码中,并且可能会在Python版本之间发生变化。从importlib开始;能够(验证和)跳过标题和marshal.loads身体可能是你需要学习的,但可能不是(因为最终,这是模块加载器已经为你做的事情)上面的示例代码,如果这还不够好,您需要深入了解内部结构。)