我有一些 python 字节码文件为“a.pyc”,“b.pyc”。我想在 C++ 代码中运行这个文件。代码可以调用 boost.python 或 python/c api。PyEval_EvalCode?
PyObject* PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
但是如何从字节码文件中获取 PyCodeObject。
我有一些 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。
如果你只是想 import foo
,或者做类似的 importlib-ish 东西,而不关心它是foo.py
or foo.pyc
,那并不难。但是,如果您试图避免通常的导入规则并通过路径名明确指定文件……那一定是可能的,但我想不出任何方法……除了:
一个 .pyc 文件实际上只是来自 的幻数PyImport_GetMagicNumber()
,然后是一个您可以忽略的 4 字节时间戳,然后是一个编组代码对象,您可以marshal.loads
从 Python 或PyMarshal_ReadObjectFromString
C中获取它。
我没有用 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>
检查它,它似乎正是它应该是的。
这在 Python 网站上有很好的记录:http: //docs.python.org/2/extending/extending.html http://docs.python.org/2/c-api/object.html#PyObject_CallObject
主要思想是初始化 Python,然后初始化模块(使用 .pyc 模块初始化 PyImport_Import),然后初始化 PyOject_CallObject。
我假设你有一个你想调用的特定方法。
http://docs.python.org/2/extending/embedding.html#pure-embedding