Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将std::string传递给PyObject\u CallFunction_Python_C++_Python Embedding - Fatal编程技术网

Python 将std::string传递给PyObject\u CallFunction

Python 将std::string传递给PyObject\u CallFunction,python,c++,python-embedding,Python,C++,Python Embedding,当我运行pResult=PyObject\u CallFunction(pFunc,“s”和“String”)时,python脚本返回正确的字符串。但是,如果我尝试运行此命令: std::string passedString = "String"; pResult = PyObject_CallFunction(pFunc, "s", &passedString) 然后将预设值转换为std::string,打印时得到。下面是一些(可能)返回的完整代码: C++代码: #include

当我运行
pResult=PyObject\u CallFunction(pFunc,“s”和“String”)
时,python脚本返回正确的字符串。但是,如果我尝试运行此命令:

std::string passedString = "String";
pResult = PyObject_CallFunction(pFunc, "s", &passedString)
然后将预设值转换为
std::string
,打印时得到
。下面是一些(可能)返回
的完整代码:

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();
}

我使用的是Ubuntu(linux),我使用的是Python 3.4,您应该向
PyObject\u CallFunction
传递一个c风格的字符串,以便代码正常工作。要从
std::string
获取c字符串,请使用
c_str()
方法。因此,下面这句话:

pResult = PyObject_CallFunction(pFunc, "s", &passedString);
应该是这样的:

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

我试过了,我得到了一个错误:
error:lvalue required作为一元操作数
Oops,我错了,我在
passedString.c_str()之前使用了
&
,你需要传递一个
char*
,所以不需要
&
pResult = PyObject_CallFunction(pFunc, "s", passedString.c_str());