Je travaille sur l'intégration de Python 2.6 dans une application C++ existante. Jusqu'à présent, j'ai les Bibliothèques liées et suis capable d'initialiser avec succès l'interpréteur Python et peut également transférer des données à Python. J'ai de la difficulté à le récupérer et j'espère que quelqu'un pourra me guider dans la bonne direction. Je travaille avec ceci:C++ et Python incorporé - Chaînes terminées NUL
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();
pOpts et pInput sont tous deux générés en utilisant PyString_FromString
plus tôt dans le code. Le problème que j'ai est que quand je tente de récupérer la sortie en utilisant PyString_AsString la valeur de retour est terminée NUL. Malheureusement, parce que je génère des documents PDF, les NUL ne sont pas seulement autorisés, ils sont presque garantis. Quelqu'un peut-il me dire comment je retourne les données de chaîne de Python en C++ sans finir à la première NUL qu'il rencontre? En complément, Ce code peut être appelé plusieurs fois dans le cadre d'un service d'arrière-plan qui crée des documents PDF à partir de données d'impression entrantes. La première fois que ce code est appelé, il fonctionne comme prévu. Les appels suivants échouent à la ligne indiquée juste après Py_Initialize()
. De l'aide sur la façon de déterminer ce qui se passe là-bas serait également très appréciée. Merci à l'avance,
NULL! = ASCII NUL. NULL est un pointeur vide, NUL est votre terminateur de chaîne. Mieux vaut ne pas confondre les deux! – LukeN
@LukeN - Mise à jour, et merci de souligner que ces deux sont distincts, mais le problème est toujours que la chaîne que je retourne de Python les contient et j'ai besoin de savoir comment contourner. –