【问题标题】:How to check the version of the python API at compile time from a C extension module?如何在编译时从 C 扩展模块检查 python API 的版本?
【发布时间】:2012-09-10 09:05:17
【问题描述】:

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

现在我遇到了一个问题,在 python 2.5 中他们为列表的大小定义了Py_ssize_t,但在 2.4 中他们只使用了int

所以我的问题是: 有没有一种简单的方法可以检查我在编译时使用的是 2.4 版还是 2.5 版的 API,以便我可以编写一个小宏?

例如:

#if PY_MINOR < 5
typedef int Py_ssize_t;
#endif

【问题讨论】:

标签: python c


【解决方案1】:

是的,Python 包含目录中的patchlevel.h 定义了您要查找的内容:

#define PY_MAJOR_VERSION    2
#define PY_MINOR_VERSION    5
#define PY_MICRO_VERSION    2

【讨论】:

    【解决方案2】:

    我想你需要的是PY_VERSION_HEX

    cython生成的c代码中有一行

    PY_VERSION_HEX &lt; 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
    

    【讨论】:

      【解决方案3】:

      只需做类似的事情。

      Import sys
      if sys.version_info < (2, 4): //do something, typedef what you need
      else // so on
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-09
        • 2011-06-03
        • 2012-09-17
        • 2020-04-04
        • 1970-01-01
        • 2014-11-24
        相关资源
        最近更新 更多