Я немного смущен. Я пытаюсь сделать некоторую интеграцию C ++ и Python, но это не так просто. Я не использую Boost, потому что я не смог заставить Boost :: Python правильно скомпилировать. Но это другая история.
В настоящее время вот что я делаю в C ++:
//set everything up
PyObject* py_main_module = PyImport_AddModule("__main__");
PyObject* py_global_dict = PyModule_GetDict(py_main_module);
PyObject* py_local_dict = PyDict_New();
PyObject* py_return_value;
PyRun_SimpleString(data.c_str()); //runs Python code, which defines functions
//call a function defined by the python code
py_return_value = PyRun_String("test()", Py_single_input, py_global_dict, py_local_dict);
//attempt to check the type of the returned value
if(py_return_value != NULL) {
//this is the problem: all of these print 0
cout << PyList_Check(py_return_value) << endl;
cout << PySet_Check(py_return_value) << endl;
cout << PyFloat_Check(py_return_value) << endl;
} else {
cout << "IT WAS NULL?!" << endl;
}
Программа Python (ввод в программу C ++ в виде строки с именем «data»):
def test():
derp = 1.234
#derp = [1, 2, 3, 4]
#derp = set([1, 2, 3, 4])
return derp
Теперь проблема в том, что проверки типов не работают. Все они возвращают 0, независимо от того, возвращает ли функция Python число с плавающей точкой, список или набор. Что я делаю неправильно?
Бонусные баллы, если кто-нибудь может сказать мне, почему вызов PyRun_String печатает возвращаемое значение в консоли. Это действительно раздражает.
От документы:
int Py_eval_input
Начальный символ из грамматики Python для изолированных выражений; для использования с
Py_CompileString()
,
int Py_file_input
Начальный символ из грамматики Python для последовательностей операторов, считанных из файла или другого источника; для использования с
Py_CompileString()
, Этот символ используется при компиляции
произвольно длинный исходный код Python.
int Py_single_input
Начальный символ из грамматики Python для одного оператора; для использования с
Py_CompileString()
, Это символ, используемый для
Интерактивный переводчик.
Py_single_input
оценивает строку как заявление. Заявления по сути ничего не возвращают, так что вы получите None
обратно из PyRun_String
, использование Py_eval_input
вместо этого, чтобы оценить строку как выражение и получить результат.
изменения Py_single_input
в Py_eval_input
кажется, чтобы решить обе проблемы.
Первый обрабатывает строку как часть цикла интерпретатора, а второй оценивает одно выражение и возвращает объект обратно. (Я не уверен, что означает возвращаемое значение в первом случае, но это не значение выражения.)
РЕДАКТИРОВАТЬ: Только что проверил, и в соответствии с nneonneoответ ниже, результат с Py_single_input
это действительно Py_None
,