Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Python模块(来自PyObject*)转换并保存为二进制数据,以便以后使用?_Python_C++_Serialization_Marshalling_Python C Api - Fatal编程技术网

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

如何将Python模块(来自PyObject*)转换并保存为二进制数据,以便以后使用?,python,c++,serialization,marshalling,python-c-api,Python,C++,Serialization,Marshalling,Python C Api,我正在使用Python/CAPI进行一些测试,以了解它是如何工作的以及如何正确地使用它。我的目标是创建C++包装器,它允许我从C++代码运行Python脚本。 我不能使用外部bindind库(如Boost.Python或Cython)。一切都很顺利,除了一件事:现在,我正在使用PyImport_Import()加载脚本 然而,在发布版本中,它们必须以专有的二进制格式分发,并在启动时加载到内存中。我在寻找一些如何实现这一点的提示——但没有结果。基本上,我需要这样做: File* file = fo

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

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

File* file = fopen("scripts.bin", "rb");
char* c_buff = malloc(...);
fread(c_buff, file, ...);
PyObject* py_module = CreatePyObjectFromBinaryData(c_buff, ...);
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();
能否提供可能的解决方案?我考虑过以这种方式使用编组功能:

FILE* file = fopen("scripts.bin", "wb");
PyMarshal_WriteObjectToFile(py_module, file, Py_MARSHAL_VERSION);
然而,这似乎不起作用。事实上,我不确定哪些对象可以通过这种方式进行封送,因为文档并没有对此做任何说明


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

是否可以只发送.pyc文件?试着这样做:

File* file = fopen("scripts.bin", "rb");
char* c_buff = malloc(...);
fread(c_buff, file, ...);
PyObject* py_module = CreatePyObjectFromBinaryData(c_buff, ...);
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();
请参阅此讨论。。。Caersten Haese说:

pyc文件包含以下内容:

1) 包含幻数的8字节头。2) “元帅” 代码对象的序列化

因此,为了将这些内容转换为代码对象,您需要 跳过8字节的头,并对其余部分进行解组

如果失败,请使用包含.pyc文件的加密zip文件?(您需要在C++代码中编码PWD)。< /P>
我认为,如果您不信任客户机,那么真正安全的东西是非常困难的(不可能的?)。

您可以发布python脚本吗?这是我被告知的最初要求之一。我负责“侦察”——可能的解决方案是什么以及它们有多复杂。如果这个问题的解决方案不容易实现,我们不会强迫它,只会使用“原始”脚本来发布应用程序。这要容易得多——Py_编译器的ingexflags和PyEval_evalcodex就是这样。问题是:是否可以序列化Py_CompileStringExFlags返回的代码对象,并使用其内容而不是每次应用程序启动时编译的原始文件。@Mateusz>…每次应用程序启动时编译。