如何在编译时从C扩展模块检查python API的版本?

如何在编译时从C扩展模块检查python API的版本?,python,c,Python,C,我正在用C编写一个python模块。 该模块需要针对python版本2.4、2.5、2.6和2.7进行编译 现在我遇到了一个问题,在Python2.5中,他们为列表的大小定义了Py\u ssize\t,但在2.4中,他们只使用int 所以我的问题是: 有没有一种简单的方法可以检查我是否在编译时使用了2.4版或2.5版的API,这样我就可以编写一个小宏了 e、 g: #如果PY_小调

我正在用C编写一个python模块。 该模块需要针对python版本2.4、2.5、2.6和2.7进行编译

现在我遇到了一个问题,在Python2.5中,他们为列表的大小定义了
Py\u ssize\t
,但在2.4中,他们只使用
int

所以我的问题是: 有没有一种简单的方法可以检查我是否在编译时使用了2.4版或2.5版的API,这样我就可以编写一个小宏了

e、 g:

#如果PY_小调<5
typedef int Py_ssizet;
#恩迪夫

做一些类似的事情

Import sys
if sys.version_info < (2, 4): //do something, typedef what you need
else // so on
导入系统 如果sys.version_info<(2,4)://做点什么,键入您需要的定义 其他//
我想你需要的是
PY\u版本\u HEX

cython生成的c代码中有一行

PY\u版本\u十六进制<0x02040000

#ifndef Py_PYTHON_H
  #error Python headers needed to compile C extensions, please install development version of Python.
#elif PY_VERSION_HEX < 0x02040000
  #error Cython requires Python 2.4+.
#else
\ifndef Py\u PYTHON\u H
#编译C扩展所需的Python头出错,请安装Python的开发版本。
#elif PY_版本_十六进制<0x02040000
#错误Cython需要Python 2.4+。
#否则
是的,在Python中,include dir定义了您要查找的内容:

#define PY_MAJOR_VERSION    2
#define PY_MINOR_VERSION    5
#define PY_MICRO_VERSION    2
另请参见,其中包含一个使用ifdef同时在Python2和Python3上工作的示例。
#define PY_MAJOR_VERSION    2
#define PY_MINOR_VERSION    5
#define PY_MICRO_VERSION    2