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

标签 c++ python c boost-python

我有一些 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() 的魔数(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/

相关文章:

通过 int 写入 int 时损坏的内存段

c++ - 链接器以什么顺序处理库目录?

c++ - 在 Linux 中使用 .lib 和 .dll 文件

c++ - 这是什么意思? (int &)a

python - 使用一致的映射跨数据框列分解值

python - 使用 aiohttp/asyncio 的异步 HTTP 调用失败并显示 "Cannot connect to host [Network is unreachable]"

C CUDA 从设备向主机发送结构数组

c++ - 类似于 Linux 上的 .dll - 如何获取它们?

python - pandas自定义聚合函数

asp.net - 如何将原始 XML 写入 ASP.NET 中的标签