C++和嵌入式Python NUL终止字符串

2024-09-20 22:59:18 发布

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

我正在将python2.6嵌入到现有的c++应用程序中。到目前为止,我已经链接了这些库,并且能够成功地初始化Python解释器,还可以将数据传输到Python。我找不到它,希望有人能指引我正确的方向。我正在处理这个:

Py_Initialize();

pModule = PyImport_ImportModule("cBuffers"); // This crashes after 1st call.
pDict = PyModule_GetDict(pModule);
pClass = PyDict_GetItemString(pDict, "rf_pdf");
pMeth = PyString_FromString("main");

if (PyCallable_Check(pClass) && PyClass_Check(pClass)) {
  pInstance = PyInstance_New(pClass, NULL, NULL);
  pOutput = PyObject_CallMethodObjArgs(pInstance, pMeth, pOpts, pInput, NULL);
}

if (pOutput != NULL) {
  string pPdf = PyString_AsString(pOutput);
  Py_DECREF(pOutput);
} else {
  PyErr_Print();
}

// Cleanup
Py_DECREF(pModule);
Py_DECREF(pModule); // Has an extra reference, not positive why.
Py_DECREF(pMeth);
Py_DECREF(pInstance);
Py_DECREF(pOpts);
Py_DECREF(pInput);

Py_Finalize();

popt和pInput都是在前面的代码中使用PyString_FromString生成的。我遇到的问题是,当我试图使用PyString_AsString检索输出时,返回值是NUL终止的。不幸的是,因为我要生成PDF文档,nul不仅是允许的,而且几乎可以保证。谁能告诉我如何将字符串数据从Python返回到C++,而不必在遇到的第一个NUL结束?在

另外一个问题是,作为后台服务的一部分,可以多次调用此代码,后台服务从传入的打印数据创建PDF文档。第一次将此代码调用到它中时如预期的那样工作。任何后续调用都将在Py_Initialize()之后的指定行失败。如果你能帮助你确定发生了什么,我们也会非常感激。提前谢谢你


Tags: 代码pyifnullfromstringpdictinitializepystring
1条回答
网友
1楼 · 发布于 2024-09-20 22:59:18

有几点:

  • 不要使用字符串。你甚至可能是 能让他们在这里工作 扭曲*u StringAndSize() 函数,但它不是 想要。您应该将数据存储在 一个自定义数据结构(或缓冲区),它只是 一个字节序列(真的吗 希望客户端执行字符串 在Python数据上的操作?)。如果您的对象真的是一个缓冲区对象,您应该使用Buffer API

  • 导入的模块的refcount为2,因为它被保存在 sys.modules(为了提高下次导入效率)。从不减少 你不拥有的推荐信 破坏你的程序。的Importing Modules部分 文件应该包括 这个,但不是。

  • 每次执行这些操作时初始化Python并将其销毁是非常昂贵的。您应该尝试重新组织用例,以便在应用程序启动时(或第一次需要Python时)只调用一次Py_Initialize,然后只在应用程序使用Python完成了时调用Py_Finalize,或者当它退出时。

  • 您在错误检查方面非常懒散—大多数PythonC/API函数都可以返回NULL来表示异常已被抛出,而您几乎从未检查过这个值。如果有什么失败了,你会在非常奇怪的地方崩溃。您可以在C/API手册的Exception Handling部分中阅读这方面的内容。

相关问题 更多 >

    热门问题