我有一些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.pyfoo.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>

并对其进行检查,似乎正是它应该是的样子。

10-04 12:10
查看更多