如何通过boost.python或python/c api调用python字节码文件

sim*_*mon 2 c c++ python boost-python

我有一些python字节码文件为"a.pyc","b.pyc".我想用c ++代码运行这个文件.代码可以调用boost.python或python/c api.PyEval_EvalCode?

PyObject* PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Run Code Online (Sandbox Code Playgroud)

但是如何从字节码文件中获取PyCodeObject.

aba*_*ert 5

据我所知,你不能从非常高级别的层面做到这一点.(你试过PyRun_SimpleFileExFlags吗?)所以你想看看导入模块 API.

如果你只是想尝试导入foo,或做相同的importlib-ish的东西,不关心它是否,foo.py或者foo.pyc,这不是太难.但是如果你试图避免通常的导入规则并通过路径名明确指定文件......这必须是可能的,但我想不出有任何办法可以做到这一点......除了:

一个.pyc文件,只是一个幻数PyImport_GetMagicNumber(),然后是一个你可以忽略的4字节时间戳,然后是一个编组的代码对象,你可以marshal.loads从Python或PyMarshal_ReadObjectFromStringC.

我没有从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>
Run Code Online (Sandbox Code Playgroud)

检查它,它似乎应该是它应该是什么.