为Python 3和Python 2编写包装器
Writing wrappers for Python 3 vs Python 2
在Python中,如果要使c++库与Py3和Py2兼容,那么为c++库编写Python包装器的方式有什么不同吗?
或者,最初为Py2编写的包装器是否应该以与Py3相同的方式工作,反之亦然?据我所知,Python包装器是用c++在.cxx文件中编写的,然后必须对其进行编译。
详细信息
我之所以这么问,是因为我想安装Aggraw(c++Anti-Grain Geometry绘图库的包装器),它在Python 2.6-7中工作,但在Python 3.4上会导致错误(Windows 7 32位,通过命令行中的"PATH=c:\Python27[或Python34]"answers"Python setup.py install")。我希望能为Python3恢复这个令人惊叹的包装器模块,并希望这里的其他人也能提供帮助。
我可以在Python 2.6和2.7上编译它,没有任何问题,而且我有Visual C++2008和2010,所以这不是编译器的问题。问题似乎出现在实际的.cxx包装器代码中。
Aggdraw包装器可能只是考虑到了Python 2x(大约10年前),所以它没有考虑到Python 3x中可能出现的问题吗?我的最佳猜测是,由于3.4版本中不推荐使用和更改了功能,包装器无法将某些c++对象/类型转换为Python。
如果有人能帮我确定故障部件是什么(请参阅下面的命令行错误代码),我可能愿意通过.cxx包装器代码来更改必要的部件?如果我们修复了它,那么我会更新这篇文章,并添加一个"复活"包装器代码的链接。
如果Python 2和3包装器之间没有区别,你知道为什么我在Py3中得到下面的错误代码而不是Py2吗?
谢谢!
原始包装代码:点击此处
C:UsersBIGKIMODesktopaggdraw-master>python setup.py build
=== freetype not available (edit setup.py to enable)
running install
running build
running build_ext
building 'aggdraw' extension
C:Program FilesMicrosoft Visual Studio 10.0VCBINcl.exe /c /nologo /Ox /MD /
W3 /GS- /DNDEBUG -Iagg2/include -IC:Python34include -IC:Python34include /Tpa
ggdraw.cxx /Fobuildtemp.win32-3.4Releaseaggdraw.obj
aggdraw.cxx
aggdraw.cxx(124) : error C2440: 'initializing' : cannot convert from 'const char
[5]' to 'Py_ssize_t'
There is no context in which this conversion is possible
aggdraw.cxx(126) : error C2440: 'initializing' : cannot convert from 'destructor
' to 'printfunc'
This conversion requires a reinterpret_cast, a C-style cast or function-
style cast
aggdraw.cxx(128) : error C2440: 'initializing' : cannot convert from 'getattrfun
c' to 'setattrfunc'
This conversion requires a reinterpret_cast, a C-style cast or function-
style cast
aggdraw.cxx(142) : error C2440: 'initializing' : cannot convert from 'const char
[4]' to 'Py_ssize_t'
There is no context in which this conversion is possible
aggdraw.cxx(144) : error C2440: 'initializing' : cannot convert from 'destructor
' to 'printfunc'
This conversion requires a reinterpret_cast, a C-style cast or function-
style cast
aggdraw.cxx(161) : error C2440: 'initializing' : cannot convert from 'const char
[6]' to 'Py_ssize_t'
There is no context in which this conversion is possible
aggdraw.cxx(163) : error C2440: 'initializing' : cannot convert from 'destructor
' to 'printfunc'
This conversion requires a reinterpret_cast, a C-style cast or function-
style cast
aggdraw.cxx(187) : error C2440: 'initializing' : cannot convert from 'const char
[5]' to 'Py_ssize_t'
There is no context in which this conversion is possible
aggdraw.cxx(189) : error C2440: 'initializing' : cannot convert from 'destructor
' to 'printfunc'
This conversion requires a reinterpret_cast, a C-style cast or function-
style cast
aggdraw.cxx(191) : error C2440: 'initializing' : cannot convert from 'getattrfun
c' to 'setattrfunc'
This conversion requires a reinterpret_cast, a C-style cast or function-
style cast
aggdraw.cxx(207) : error C2440: 'initializing' : cannot convert from 'const char
[5]' to 'Py_ssize_t'
There is no context in which this conversion is possible
aggdraw.cxx(209) : error C2440: 'initializing' : cannot convert from 'destructor
' to 'printfunc'
This conversion requires a reinterpret_cast, a C-style cast or function-
style cast
aggdraw.cxx(211) : error C2440: 'initializing' : cannot convert from 'getattrfun
c' to 'setattrfunc'
This conversion requires a reinterpret_cast, a C-style cast or function-
style cast
aggdraw.cxx(488) : error C3861: 'PyString_Check': identifier not found
aggdraw.cxx(489) : error C3861: 'PyString_AS_STRING': identifier not found
aggdraw.cxx(575) : error C3861: 'PyString_Check': identifier not found
aggdraw.cxx(583) : error C3861: 'PyString_AS_STRING': identifier not found
aggdraw.cxx(584) : error C3861: 'PyString_GET_SIZE': identifier not found
aggdraw.cxx(730) : error C3861: 'PyInt_Check': identifier not found
aggdraw.cxx(730) : error C3861: 'PyInt_AS_LONG': identifier not found
aggdraw.cxx(731) : error C3861: 'PyInt_Check': identifier not found
aggdraw.cxx(731) : error C3861: 'PyInt_AS_LONG': identifier not found
aggdraw.cxx(735) : error C3861: 'PyInt_Check': identifier not found
aggdraw.cxx(735) : error C3861: 'PyInt_AS_LONG': identifier not found
aggdraw.cxx(736) : error C3861: 'PyInt_Check': identifier not found
aggdraw.cxx(736) : error C3861: 'PyInt_AS_LONG': identifier not found
aggdraw.cxx(742) : error C3861: 'PyInt_Check': identifier not found
aggdraw.cxx(742) : error C3861: 'PyInt_AS_LONG': identifier not found
aggdraw.cxx(745) : error C3861: 'PyInt_Check': identifier not found
aggdraw.cxx(745) : error C3861: 'PyInt_AS_LONG': identifier not found
aggdraw.cxx(759) : error C3861: 'PyInt_Check': identifier not found
aggdraw.cxx(760) : error C3861: 'PyInt_AsLong': identifier not found
aggdraw.cxx(763) : error C3861: 'PyString_Check': identifier not found
aggdraw.cxx(765) : error C3861: 'PyString_AS_STRING': identifier not found
aggdraw.cxx(788) : error C3861: 'PyString_Check': identifier not found
aggdraw.cxx(789) : error C3861: 'PyString_AS_STRING': identifier not found
aggdraw.cxx(1157) : error C3861: 'PyString_FromStringAndSize': identifier not fo
und
aggdraw.cxx(1289) : error C3861: 'PyString_FromString': identifier not found
aggdraw.cxx(1294) : error C3861: 'Py_FindMethod': identifier not found
aggdraw.cxx(1482) : error C3861: 'Py_FindMethod': identifier not found
aggdraw.cxx(1890) : error C3861: 'Py_FindMethod': identifier not found
aggdraw.cxx(1910) : error C3646: 'initaggdraw' : unknown override specifier
aggdraw.cxx(1911) : error C2091: function returns function
aggdraw.cxx(1911) : error C4430: missing type specifier - int assumed. Note: C++
does not support default-int
aggdraw.cxx(1912) : error C2039: 'ob_type' : is not a member of '_typeobject'
c:python34includeobject.h(334) : see declaration of '_typeobject'
aggdraw.cxx(1912) : error C2039: 'ob_type' : is not a member of '_typeobject'
c:python34includeobject.h(334) : see declaration of '_typeobject'
aggdraw.cxx(1913) : error C2039: 'ob_type' : is not a member of '_typeobject'
c:python34includeobject.h(334) : see declaration of '_typeobject'
aggdraw.cxx(1913) : error C2039: 'ob_type' : is not a member of '_typeobject'
c:python34includeobject.h(334) : see declaration of '_typeobject'
aggdraw.cxx(1913) : error C2039: 'ob_type' : is not a member of '_typeobject'
c:python34includeobject.h(334) : see declaration of '_typeobject'
aggdraw.cxx(1915) : error C3861: 'Py_InitModule': identifier not found
aggdraw.cxx(1940) : warning C4508: 'DL_EXPORT' : function should return a value;
'void' return type assumed
Python FFI库(ctype)在每个版本的Python之间都有变化。这将取决于你浏览更改列表,看看到底有什么不同,以及为什么它不起作用。
例如,ssizet和字符串在两个Python版本之间是不同的。
https://docs.python.org/3/whatsnew/3.2.html#ctypesPython 2和3 之间的ctypes差异
为了扩展上一个答案,Py2.7中有许多函数作用于字符串,现在Py3中有很多函数作用于字节或unicode。类似地,所指的int现在可能指的是long。PyString_Check已经被pyBytes_Check弃用,这只是其中一个导致问题的例子。阅读以下内容了解更多详细信息:
https://docs.python.org/3/howto/cporting.html?highlight=pystring
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 尝试通过Process Pipe发送/接收到python包装器,c ++代码
- 如何在 python 包装中使用 unicode 字符串用于带有 cython 的 c++ 类?
- Swig C++ python 包装器文件解释
- 当我使用py 生成时,然后在macOS上boost.python包装器时,我会发现有关std :: string的错
- 用python包装C++代码(手动)
- 为 c++ 代码编写 python 包装器
- 将图像从Python包装器传递到C 功能
- C Python包装器中的内存泄漏
- 从Boost Python包装工厂创建一个派生的类
- 使用 Python 包装器编译 VTK
- 提升 Python 包装的虚拟类 - 子类返回错误:与C++签名不匹配
- Boost.Python 包装器中的纯虚拟重载运算符
- numpyarrayobject.h 在 Windows 中编译 SWIG python 包装器时未被 MinGW
- Boost.Python 包装原始指针但公开方法
- C++库的 Python 包装器
- 增强嵌套类的 Python 包装器 - 恢复全局范围
- 如何从hadoop python包装器运行c++可执行文件
- __str__()在打印用SWIG为Python包装的c++类时未调用
- 如何为python包装一个c++库