繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM