[英]How convert and save Python module (from PyObject*) as binary data to use it later?
我正在使用Python / C API做一些测试,以了解它是如何工作的以及如何正确使用它。 我的目标是创建C ++包装程序,使我可以从C ++代码运行Python脚本。 我不能使用外部bindind库(例如Boost.Python或Cython)。 除了一件事,一切都进行得很好:现在,我正在使用PyImport_Import()加载脚本
PyObject* py_module = PyImport_Import(py_module_name); //imports *.py file
//do something, call functions, save results
PyDecRef(py_module);
但是,在发行版中,它们必须以专有二进制格式分发并在启动时加载到内存中。 我一直在寻找如何实现这一目标的提示-没有结果。 基本上,我需要执行以下操作:
File* file = fopen("scripts.bin", "rb");
char* c_buff = malloc(...);
fread(c_buff, file, ...);
PyObject* py_module = CreatePyObjectFromBinaryData(c_buff, ...);
smeone是否可以提供可能的解决方案? 我考虑过以这种方式使用编组功能:
FILE* file = fopen("scripts.bin", "wb");
PyMarshal_WriteObjectToFile(py_module, file, Py_MARSHAL_VERSION);
但是,这似乎不起作用。 实际上,我不确定可以用这种方式将哪些对象编组,因为文档没有说明任何内容。
可选问题:我的二进制文件夹中有所有* .py文件。 在启动时,在PyImport_Import()之后,它们被隐式编译为/ pycache中的字节码( .pyc)。 我知道可以使用compileall模块创建字节码文件( .pyc或* .pyo)。 是否可以使用此类文件的内容创建包含模块数据的PyObject?
仅运送.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 Caersten Haese说:
pyc文件包含以下内容:
1)包含魔术数字的8字节标头。 2)代码对象的“封送”序列化。
因此,为了将这些内容转换为代码对象,您需要跳过8个字节的标头,然后将其余的内容解组。
无法使用包含.pyc文件的加密zip文件? (您需要在C ++代码中对pwd进行编码)。
我认为,如果您不信任客户,那么真正安全的东西真的很难(不可能吗?)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.