我有一个声明函数和徽标的字节码文档。我还有一个.py文件,我调用字节码来输出函数中的徽标和字符串。我如何实际执行字节码?我能够拆开它并查看汇编代码。我怎么能真正运行它?
question.py
import dis
import logo
def work_here():
# execute the bytecode
def main():
work_here()
if __name__ == '__main__':
main()
答案 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
身体可能是你需要学习的,但可能不是(因为最终,这是模块加载器已经为你做的事情)上面的示例代码,如果这还不够好,您需要深入了解内部结构。)