我有一些 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()
的魔数(Magic Number),然后是一个你可以忽略的 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>
检查它,它似乎正是它应该的样子。
关于c++ - 如何通过 boost.python 或 python/c api 调用 python 字节码文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14205845/