我正在将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()
之后的指定行失败。如果你能帮助你确定发生了什么,我们也会非常感激。提前谢谢你
有几点:
不要使用字符串。你甚至可能是 能让他们在这里工作 扭曲*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部分中阅读这方面的内容。
相关问题 更多 >
编程相关推荐