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;
}
これは、ユニコード文字列()を処理しないことに注意しu'Python'
てください。また、printステートメントcase PRINT_ITEM
を処理するinを変更することもできます。Modules/ceval.c
Pythonプログラムには、呼び出す以外の方法で印刷する方法があることに注意してください。たとえば、navtive(C)関数に書き込んだり、印刷を実行させたりしますprint
。sys.stdout