如何将Python模块(来自PyObject*)转换并保存为二进制数据以便以后使用?

2024-09-27 20:16:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python/capi进行一些测试,以了解它是如何工作的以及如何正确地使用它。我的目标是创建C++包装器,它允许我从C++代码运行Python脚本。 我不能使用外部bindind库(比如Boost.Python或者赛顿)。一切正常,除了一件事:现在,我正在使用PyImport_Import()加载脚本

PyObject* py_module = PyImport_Import(py_module_name); //imports *.py file
//do something, call functions, save results
PyDecRef(py_module);

然而,在发行版中,它们必须以专有的二进制格式分发,并在启动时加载到内存中。我在寻找一些如何实现这一点的提示-但没有结果。基本上,我需要这样做:

^{pr2}$

史密欧能提供可能的解决方案吗?我考虑过这样使用编组功能:

FILE* file = fopen("scripts.bin", "wb");
PyMarshal_WriteObjectToFile(py_module, file, Py_MARSHAL_VERSION);

然而,这似乎行不通。事实上,我不确定哪些对象可以用这种方式进行编组,因为文档中没有任何关于它的说明。在

可选问题:我的二进制文件夹中有所有*.py文件。启动时,在PyImport_Import()之后,它们被简单地编译为/pycache中的字节码(.pyc)。我知道字节码文件(.pyc或*.pyo)可以使用compileall模块创建。是否可以使用此类文件的内容创建包含模块数据的PyObject?在


Tags: 模块文件pyimport脚本目标字节二进制
1条回答
网友
1楼 · 发布于 2024-09-27 20:16:27

只发送.pyc文件可以接受吗?试试这样的方法:

int size;
unsigned char *python_code;
PyObject *mainobj;
size = load_file("multiply.pyc", &python_code);    
Py_Initialize();
codeobj = PyMarshal_ReadObjectFromString(python_code+8, size-8);
mainobj = PyImport_ExecCodeModule("multiply", codeobj);
Py_Finalize();

看这个讨论。。。https://groups.google.com/forum/#!topic/comp.lang.python/zhIe_Aa2Ih8卡斯滕·海斯说:

A pyc file contains the following:

1) An 8 byte header containing a magic number. 2) A "marshal" serialization of the code object.

So, in order to transform those contents into a code object, you need to skip the 8 byte header and an unmarshal the rest.

如果不能使用包含.pyc文件的加密zip文件?(您需要在c++代码中对pwd进行编码)。在

我认为真正安全的东西真的很难(不可能?)如果你不信任客户。在

相关问题 更多 >

    热门问题