Python 解释器处理的对象是 Python 对象,而不是 C 对象。因此,您必须使用特定于解释器的函数来与 C 字符串进行比较,如下所示:
PyObject *o = PyTuple_GetItem(args, i);
if (PyUnicode_CheckExact(o) && PyUnicode_CompareWithASCIIString(o, "Python")==0){
printf("Do something else ..\n");
} else {
err = PyFile_WriteObject(o, file, Py_PRINT_RAW);
if (err)
return NULL;
}
添加它来代替当前代码。对于较旧的 2.7.3 版本,您必须使用 PyString* 系列函数,例如
if (PyUnicode_CheckExact(o)) {
PyObject* utf8 = PyUnicode_AsUTF16String(o);
if (strcmp(PyString_AsString(o), "Python")==0) {
printf("Do something else (unicode)\n");
}
Py_DECREF(utf8);
} else if (PyString_CheckExact(o) && strcmp(PyString_AsString(o), "Python")==0){
printf("Do something else (str) ..\n");
} else {
err = PyFile_WriteObject(o, file, Py_PRINT_RAW);
if (err)
return NULL;
}
请注意,这不处理 unicode 字符串 ( u'Python'
),您可以使用 . 您可能还对修改case PRINT_ITEM
in感兴趣Modules/ceval.c
,它处理 print语句。
请注意,除了调用之外,Python 程序还有其他打印方式print
,包括写入sys.stdout
或让原生 (C) 函数进行打印。