将 std::string 传递给 PyObject_CallFunction
Pass std::string into PyObject_CallFunction
当我运行pResult = PyObject_CallFunction(pFunc, "s", &"String")
时,python脚本returns正确的字符串。但是,如果我尝试 运行 这个:
std::string passedString = "String";
pResult = PyObject_CallFunction(pFunc, "s", &passedString)
然后把pResult转成std::string
,我打印的时候得到<NULL>
。这是一些(可能)完整的代码 returns <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 字符串,请使用 c_str()
方法。所以下面一行:
pResult = PyObject_CallFunction(pFunc, "s", &passedString);
应该是这样的:
pResult = PyObject_CallFunction(pFunc, "s", passedString.c_str());
当我运行pResult = PyObject_CallFunction(pFunc, "s", &"String")
时,python脚本returns正确的字符串。但是,如果我尝试 运行 这个:
std::string passedString = "String";
pResult = PyObject_CallFunction(pFunc, "s", &passedString)
然后把pResult转成std::string
,我打印的时候得到<NULL>
。这是一些(可能)完整的代码 returns <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 字符串,请使用 c_str()
方法。所以下面一行:
pResult = PyObject_CallFunction(pFunc, "s", &passedString);
应该是这样的:
pResult = PyObject_CallFunction(pFunc, "s", passedString.c_str());