Python2和Python3的差异很大,这是为什么很多人都不愿意升级的原因。如果你用C/C++为Python2写过扩展模块,那么直接用Python3来编译是通不过的。这篇文章分享下如何编写兼容的C/C++代码。
环境搭建
- Python 3.5.0
- OpenCV 3.3.0
pip install opencv-python
- Numpy 1.11.2
pip install numpy
- Visual Studio 2015
SET VS90COMNTOOLS=%VS140COMNTOOLS%
- 你需要的C/C++库。我这里用的是Dynamsoft Barcode Reader 5.2 for Windows。你需要把DLL拷贝到Python35\Lib\site-packages目录下。
模块初始化
Python官方有一篇文章Porting Extension Modules to Python 3,详细介绍了Python2和Python3的差异。阅读完文章你就可以写出最简单的C/C++兼容代码。
#include "Python.h"
struct module_state {
PyObject *error;
};
#if PY_MAJOR_VERSION >= 3
#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
#else
#define GETSTATE(m) (&_state)
static struct module_state _state;
#endif
static PyObject *
error_out(PyObject *m) {
struct module_state *st = GETSTATE(m);
PyErr_SetStr