Python2和3的c api不兼容的解决办法

如果用C写Python api遇到:
PyString_AsString找不到了,这是因为python2和3的c api不一样导致的,

可以加入如下预定义,解决大部分接口不一致。


// ===== Python 3需要的宏定义 ====
#if PY_MAJOR_VERSION >= 3

// Int/Long兼容性
#define PyIntObject PyLongObject
#define PyInt_Type PyLong_Type
#define PyInt_Check PyLong_Check
#define PyInt_FromLong PyLong_FromLong
#define PyInt_AsLong PyLong_AsLong

// Unicode/String兼容性
#define PyString_InternFromString PyUnicode_InternFromString
#define PyString_FromFormat PyUnicode_FromFormat
#define PyString_Check PyUnicode_Check
#define PyString_FromString PyUnicode_FromString
#define PyString_FromStringAndSize PyUnicode_FromStringAndSize

// 将此用于PyUnicode_EncodeLocale,参见PEP 383
#define PROJ_PYUNICODE_ENC "surrogateescape"

// 为了兼容Python 3.2
#if PY_VERSION_HEX < 0x03030000
#define PyUnicode_DecodeLocaleAndSize PyUnicode_DecodeFSDefaultAndSize
#define PyUnicode_DecodeLocale PyUnicode_DecodeFSDefault
#define PyUnicode_EncodeLocale(o, e) PyUnicode_EncodeFSDefault(o)
#define PyString_AsString _PyUnicode_AsString
#else
#define PyString_AsString PyUnicode_AsUTF8
#endif

#endif

// ===== Python 2所需的宏定义 ====
#else

// Python 3引入了一个新类型"Py_hash_t"
typedef long Py_hash_t;
typedef unsigned long Py_uhash_t;

// 为了兼容Python 2.5
#ifndef PyVarObject_HEAD_INIT
#define PyVarObject_HEAD_INIT(type, size) PyObject_HEAD_INIT(type) size,
#endif

// 为了兼容Python 2.5
#ifndef Py_TYPE
#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
#endif

// 为了兼容Python 2.5
#ifndef PyBytes_Check
#define PyBytesObject PyStringObject
#define PyBytes_Type PyString_Type
#define PyBytes_Check PyString_Check
#define PyBytes_CheckExact PyString_CheckExact
#define PyBytes_AS_STRING PyString_AS_STRING
#define PyBytes_GET_SIZE PyString_GET_SIZE
#define PyBytes_FromStringAndSize PyString_FromStringAndSize
#define PyBytes_FromString PyString_FromString
#define PyBytes_FromFormat PyString_FromFormat
#define PyBytes_Size PyString_Size
#define PyBytes_AsString PyString_AsString
#define PyBytes_Concat PyString_Concat
#define PyBytes_ConcatAndDel PyString_ConcatAndDel
#define _PyBytes_Resize _PyString_Resize
#define PyBytes_Format PyString_Format
#define PyBytes_AsStringAndSize PyString_AsStringAndSize
#endif

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值