我有一些python字节码文件,分别为“a.pyc”,“b.pyc”。我想用C++代码运行此文件。
该代码可以调用boost.python或python / c api。
PyEval_EvalCode?
PyObject* PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
但是如何从字节码文件中获取PyCodeObject。
最佳答案
据我所知,您不能在“非常高级别”层中执行此操作。 (您尝试过PyRun_SimpleFileExFlags
吗?)因此,您想看看Importing Modules API。
如果您只是想导入foo
,或做等效的importlib-ish的事情,而不必关心foo.py
或foo.pyc
,那不是很难。但是,如果您要避免使用常规的导入规则,并通过路径名显式指定文件,则必须这样做……但我想不出什么办法……,除了:
在后台,.pyc文件只是PyImport_GetMagicNumber()
中的魔术数字,然后是您可以忽略的4字节时间戳,然后是编码的代码对象,您可以从Python中的marshal.loads
或从C中的PyMarshal_ReadObjectFromString
。
我还没有从C进行过测试,但是从Python进行过测试:
>>> with open('foo.pyc', 'rb') as f:
... data = f.read()
>>> code = marshal.loads(data[8:])
>>> code
<code object <module> at 0x110118730, file "foo.py", line 1>
并对其进行检查,似乎正是它应该是的样子。