根据 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 预处理器逐字复制代码。
我有一些类型映射,如果我为 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 预处理器逐字复制代码。