我正在尝试将嵌入式python添加到OpenGL / SDL应用程序中。 到目前为止一切正常,比如通过SDL键盘事件输入字符串并使用嵌入式python解释器执行它。 我现在要添加函数来调用C / C ++函数,比如
void set_iterations(int c);
使用在python解释器上调用
>>> test.iterations(23)
解析整数参数就像魅力
一样static PyObject* test_iterations(PyObject *self, PyObject *args) {
int iterations;
PyArg_ParseTuple(args,"i",&iterations);
set_iterations(iterations);
return Py_None;
}
但是当我尝试这个时:>>> test.addignore('something')
static PyObject* test_addignore(PyObject *self, PyObject *args) {
char* ignorestring;
//PyArg_ParseTuple(args,"s",ignorestring);
PyArg_ParseTuple(args,"s",&ignorestring);
add_global_ignore(ignorestring); // C function
return Py_None;
}
Python给了我这个错误:
Traceback (most recent call last):
File "<string>", line 1, in <module>
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-3: invalid data
字符串应该是UTF-8,因为SDL设置为从键盘上抓取UNICODE,其他一切都很完美。
有没有人知道我在这里做错了什么?
我还检查了使用
传递给函数的args对象std::string args_str;
PyObject* repr = PyObject_Repr(args);
if (repr != NULL) {
args_str = PyBytes_AsString(PyUnicode_AsEncodedString(repr, "utf-8", "Error"));
Py_DECREF(repr);
}
std::cout << args_str << "\n";
它给了我这个:('somestring',)
解决方案: rodrigo指出的错误,最初导致相信我的调试代码应该将结果字符串打印为PyObject是错误的。但问题是我正在向解析器传递错误的指针,导致内存中的未定义行为,因此导致我相信解析器是问题。 发生的最后一个解析器错误是调试输出本身,它指向错误的内存地址。 谢谢罗德里戈,因为你的答案导致解决问题:接受。感谢您的帮助和耐心。
答案 0 :(得分:3)
尝试:
static PyObject* test_addignore(PyObject *self, PyObject *args) {
char* ignorestring;
if (!PyArg_ParseTuple(args,"s", &ignorestring)) //Note the &
return NULL; //Never ignore errors
add_global_ignore(ignorestring);
Py_RETURN_NONE; //Always use helper macros
}