Tôi đang cố gọi một hàm trong một tập lệnh Python từ chương trình C++ chính của tôi. Hàm python lấy một chuỗi làm đối số và trả về không có gì (ok .. 'None'). Nó hoạt động hoàn toàn tốt (không bao giờ nghĩ rằng nó sẽ được dễ dàng ..) miễn là cuộc gọi trước đó được hoàn thành trước khi chức năng được gọi lại, nếu không có một sự vi phạm truy cập tại pModule = PyImport_Import(pName)
.Gọi Python từ C++
Có rất nhiều hướng dẫn cách nhúng python vào C và ngược lại nhưng tôi không tìm thấy gì về vấn đề đó.
int callPython(TCHAR* title){
PyObject *pName, *pModule, *pFunc;
PyObject *pArgs, *pValue;
Py_Initialize();
pName = PyUnicode_FromString("Main");
/* Name of Pythonfile */
pModule = PyImport_Import(pName);
Py_DECREF(pName);
if (pModule != NULL) {
pFunc = PyObject_GetAttrString(pModule, "writeLyricToFile");
/* function name. pFunc is a new reference */
if (pFunc && PyCallable_Check(pFunc)) {
pArgs = PyTuple_New(1);
pValue = PyUnicode_FromWideChar(title, -1);
if (!pValue) {
Py_DECREF(pArgs);
Py_DECREF(pModule);
showErrorBox(_T("pValue is false"));
return 1;
}
PyTuple_SetItem(pArgs, 0, pValue);
pValue = PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pArgs);
if (pValue != NULL) {
//worked as it should!
Py_DECREF(pValue);
}
else {
Py_DECREF(pFunc);
Py_DECREF(pModule);
PyErr_Print();
showErrorBox(_T("pValue is null"));
return 1;
}
}
else {
if (PyErr_Occurred()) PyErr_Print();
showErrorBox(_T("pFunc null or not callable"));
return 1;
}
Py_XDECREF(pFunc);
Py_DECREF(pModule);
}
else {
PyErr_Print();
showErrorBox(_T("pModule is null"));
return 1;
}
Py_Finalize();
return 0;
}
Tôi rất vui vì điều này đã khắc phục được sự cố của bạn. Tôi không thể nghĩ tại sao bạn có vấn đề gọi Py_Finalize() - có lẽ bạn có thể cung cấp một ví dụ đơn giản cho thấy vấn đề trong câu hỏi khác. Bạn thực sự nên tắt Python một cách rõ ràng, nhưng nếu bạn chỉ muốn thoát khỏi ứng dụng, bạn có thể ổn ... Tôi mạnh mẽ khuyên bạn nên tìm ra lý do tại sao nó bị treo. –
@DanielPaull bạn có thể vui lòng cho một ví dụ làm việc đơn giản cho cùng một chủ đề trên. Vì vậy, tôi có thể hiểu dễ dàng – lkkkk