Pass std::string into PyObject_CallFunction

Pass std::string into PyObject_CallFunction

本文关键字:CallFunction PyObject string std Pass into      更新时间:2023-10-16

当我运行pResult = PyObject_CallFunction(pFunc, "s", &"String")时,python脚本返回正确的字符串。但是,如果我试着运行这个:

std::string passedString = "String";
pResult = PyObject_CallFunction(pFunc, "s", &passedString)

然后将结果转换为std::string,当我打印它时,我得到<NULL>。以下是返回<NULL>的一些(可能)完整代码:

c++代码:

#include <Python.h>
#include <string>
#include <iostream>
int main()
{
    PyObject *pName, *pModule, *pDict, *pFunc;
    // Set PYTHONPATH TO working directory
    setenv("PYTHONPATH",".",1); //This doesn't help
    setenv("PYTHONDONTWRITEBYTECODE", " ", 1);
    // Initialize the Python Interpreter
    Py_Initialize();
    // Build the name object
    pName = PyUnicode_FromString((char*)"string");
    // Load the module object
    pModule = PyImport_Import(pName);
    // pDict is a borrowed reference
    pDict = PyModule_GetDict(pModule);
    // pFunc is also a borrowed reference
    pFunc = PyDict_GetItemString(pDict, (char*)"getString");
    if (pFunc != NULL)
    {
        if (PyCallable_Check(pFunc))
        {
            PyObject *pResult;
            std::string passedString = "String";
            pResult = PyObject_CallFunction(pFunc, "s", &passedString);
            PyObject* pResultStr = PyObject_Repr(pResult);
            std::string returnedString = PyUnicode_AsUTF8(pResultStr);
            std::cout << returnedString << std::endl;
            Py_DECREF(pResult);
            Py_DECREF(pResultStr);
        }
        else {PyErr_Print();}
    }
    else {std::cout << "pFunc is NULL!" << std::endl;}
    // Clean up
    Py_DECREF(pFunc);
    Py_DECREF(pDict);
    Py_DECREF(pModule);
    Py_DECREF(pName);
    // Finish the Python Interpreter
    Py_Finalize();
}

Python脚本(string.py):

def getString(returnString):
        return returnString

我在Ubuntu (linux)上使用Python 3.4

您应该将c风格的字符串传递给PyObject_CallFunction以使您的代码工作。为了从std::string中获得c-string,请使用c_str()方法。所以下面这行:

pResult = PyObject_CallFunction(pFunc, "s", &passedString);

应该像这样:

pResult = PyObject_CallFunction(pFunc, "s", passedString.c_str());