2

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

PyObject* PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)

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

4

2 回答 2

5

据我所知,您无法从“非常高级”层执行此操作。(你试过PyRun_SimpleFileExFlags吗?)所以你想看看Importing Modules API。

如果你只是想 import foo,或者做类似的 importlib-ish 东西,而不关心它是foo.pyor 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>

检查它,它似乎正是它应该是的。

于 2013-01-07T23:49:18.520 回答
-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

于 2013-01-07T23:55:28.080 回答