根据 Python 版本生成 SWIG 代码

Generating SWIG code based on Python version

我有一些类型映射,如果我为 Python 2 编译,我需要使用 PyInt;如果我为 Python 3 编译,我需要使用 PyLong。我尝试这样做:

#if PY_VERSION_HEX >= 0x03000000
%typemap(in) ssize_t {
     = PyLong_AsSsize_t($input);
}
#else
%typemap(in) ssize_t {
     = PyInt_AsSsize_t($input);
}
#endif

(在这个例子中,ssize_t 是一个类型定义的整数类型。)

然而,这需要第二个分支,然后抱怨 PyInt 未定义(因为 PyInt 在 Python 2 中不存在)。

PY_VERSION_HEX仅在编译代码时定义(包括python header),但在SWIG解析代码时不会定义。您可以改用以下内容:

%typemap(in) ssize_t {
%#if PY_VERSION_HEX >= 0x03000000
     = PyLong_AsSsize_t($input);
%#else
     = PyInt_AsSsize_t($input);
%#endif
}

编辑:抱歉,需要修正答案。 %#... 语法告诉 SWIG 预处理器逐字复制代码。