Проблема в том, что количество параметров в операторе SQL не совпадает с количеством предоставленных аргументов. Это не очевидно, глядя на код, но
Object[] obj = new Object[3];
obj[0] = "Duke";
jdbcTemplate.update(sql, obj);
в основном совпадает с
jdbcTemplate.update(sql, new Object[] { "Duke", null, null });
. это то же самое.
Для обработки различного количества аргументов вы можете перейти от массивов к спискам.
В первую очередь, измените свою функцию на return
значение. print
луг это усложнит вещи, так как Вы хотите вернуть значение. Предположим Ваш MyModule.py
похож на это:
import thirdparty
def MyFunc(some_arg):
result = thirdparty.go()
return result
Теперь, чтобы сделать, что Вы хотите, необходимо пойти вне основного встраивания, как говорится в документации. Вот полный код для выполнения функции:
#include <Python.h>
int
main(int argc, char *argv[])
{
PyObject *pName, *pModule, *pFunc;
PyObject *pArgs, *pArg, *pResult;
int i;
Py_Initialize();
pName = PyString_FromString("MyModule.py");
/* Error checking of pName left out as exercise */
pModule = PyImport_Import(pName);
Py_DECREF(pName);
if (pModule != NULL) {
pFunc = PyObject_GetAttrString(pModule, "MyFunc");
/* pFunc is a new reference */
if (pFunc) {
pArgs = PyTuple_New(0);
pArg = PyString_FromString("some parameter")
/* pArg reference stolen here: */
PyTuple_SetItem(pArgs, 0, pArg);
pResult = PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pArgs);
if (pResult != NULL) {
printf("Result of call: %s\n", PyString_AsString(pResult));
Py_DECREF(pResult);
}
else {
Py_DECREF(pFunc);
Py_DECREF(pModule);
PyErr_Print();
fprintf(stderr,"Call failed\n");
return 1;
}
}
else {
if (PyErr_Occurred())
PyErr_Print();
fprintf(stderr, "Cannot find function");
}
Py_XDECREF(pFunc);
Py_DECREF(pModule);
}
else {
PyErr_Print();
fprintf(stderr, "Failed to load module");
return 1;
}
Py_Finalize();
return 0;
}
На основе ΤΖΩΤΖΙΟΥ Josh и ответов Nosklo я наконец получил его работа с помощью boost.python:
Python:
import thirdparty
def MyFunc(some_arg):
result = thirdparty.go()
return result
C++:
#include <string>
#include <iostream>
#include <boost/python.hpp>
using namespace boost::python;
int main(int, char **)
{
Py_Initialize();
try
{
object module = import("__main__");
object name_space = module.attr("__dict__");
exec_file("MyModule.py", name_space, name_space);
object MyFunc = name_space["MyFunc"];
object result = MyFunc("some_args");
// result is a dictionary
std::string val = extract<std::string>(result["val"]);
}
catch (error_already_set)
{
PyErr_Print();
}
Py_Finalize();
return 0;
}
Некоторые важные моменты:
Я думаю, в чем Вы нуждаетесь, также PyObject_CallObject(<py function>, <args>)
, который возвращает возвращаемое значение функции, Вы звоните как PyObject, или PyRun_String(<expression>, Py_eval_input, <globals>, <locals>)
который оценивает отдельное выражение и возвращает его результат.
Необходимо смочь возвратить результат MyFunc, который затем закончил бы в переменной, которую Вы в настоящее время называете "проигнорированными". Это избавляет от необходимости получать доступ к нему любым другим способом.