0

这个问题来自我之前的问题

我不必更改 builtin_print() 的整个实现。我只需要为例如'python'寻找一个特定的参数。

对于以下语句——</p>

from __future__ import print_function
print('python')

每当有'python'的打印时,我希望我的代码做其他事情。问题是:

builtin_print(PyObject *self, PyObject *args, PyObject *kwds)

args 是 PyObject 类型。我无法使用“Python”来 strcmp 或 memcmp args[1]。

有任何想法吗?

4

1 回答 1

0

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_ITEMin感兴趣Modules/ceval.c,它处理 print语句

请注意,除了调用之外,Python 程序还有其他打印方式print,包括写入sys.stdout或让原生 (C) 函数进行打印。

于 2012-10-28T20:57:49.107 回答