首页 > 解决方案 > 如何在 Mac 上使用 Python 3.8 处理 C 代码中的 tp_print?

问题描述

我需要为 Mac、Windows 和 Linux 上的 Python 3.7 和 3.8 构建与 Python C API 兼容的 C++ 代码。问题是,在 Mac 上,对于 3.8.1,clang 编译器让我对我是否在末尾PyTypeObject初始化字段(结果消息:)或省略它(结果消息:)的定义感到悲痛。相比之下,Windows 上的 Visual C++ 以任何一种方式接受代码。同时,虽然 Linux 上的 g++ 会抱怨,像 clang 一样,当我初始化字段失败时,至少当我初始化它时它是满意的。tp_printtp_print is deprecated [-Werror, -Wdeprecated-declarationsmissing field 'tp-print' initializer [-Werror,-Wmissing-field-initializers]tp_print

PyTypeObject当我初始化时,我正在初始化的代码的尾部看起来像这样tp_print

    0,                            // tp_weaklist
    0,                            // tp_del
    0,                            // tp_version_tag
#if PY_MAJOR_VERSION >= 3
    0                             // tp_finalize
#endif
#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 8
    ,
    0                             // tp_vectorcall
    ,
    0                             // tp_print
#endif
};

当我不初始化tp_print时,它看起来像这样:

    0,                            // tp_weaklist
    0,                            // tp_del
    0,                            // tp_version_tag
#if PY_MAJOR_VERSION >= 3
    0                             // tp_finalize
#endif
#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 8
    ,
    0                             // tp_vectorcall
    //,
    //0                             // tp_print
#endif
};

我发现如果我在定义之前包含此代码:

#ifdef __APPLE__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
#endif

之后的代码:

#ifdef __APPLE__
#pragma clang diagnostic pop
#endif

然后一切正常。有没有更优雅的方法来解决这个问题?Python 开发人员希望我们做什么:初始化tp_print,还是不初始化?

标签: pythoncpython-3.x

解决方案


推荐阅读