2014-09-22 83 views
1

在Python中,如果爲了使它與Py3與Py2兼容,在編寫C++庫的Python包裝方面是否有區別?爲Python 3和Python 2編寫包裝

或者最初爲Py2編寫的包裝器應該以相同的方式用於Py3,反之亦然?據我瞭解,Python包裝是用C++編寫的.cxx文件,然後必須編譯。

詳細

我問,因爲我想安裝Aggdraw(包裝的C++反穀物幾何繪圖庫),這在Python 2.6-7的作品,但在關於Python 3.4(Windows 7的32位錯誤結果在命令行中通過「PATH = C:/ Python27 [或Python34]」和「python setup.py install」)。我的希望是爲Python 3重振這個驚人的包裝模塊,並希望這裏的其他人在幫忙時會很有趣。

我可以在沒有任何問題的情況下在Python 2.6和2.7上編譯它,並且我有Visual C++ 2008和2010,所以它不是編譯器問題。問題似乎在實際的.cxx包裝代碼中。

是不是因爲Aggdraw包裝器只是用Python 2x編寫的(大約10年前),所以它沒有考慮到Python 3x中可能出現的問題?我最好的猜測是,由於3.4版本中的棄用和更改功能,wrapper未能將某些C++對象/類型轉換爲Python。

如果有人可以幫助我確定故障部件是什麼(請參閱下面的命令行錯誤代碼),我可能願意通過.cxx包裝代碼更改必要的部件。如果我們修復了這個問題,那麼我會通過鏈接到「復活」的封裝代碼來更新這篇文章。

如果Python 2和3包裝之間應該沒有區別,那麼爲什麼我會在Py3中獲取錯誤代碼而不是Py2?

謝謝!

原始包裝代碼:click here

C:\Users\BIGKIMO\Desktop\aggdraw-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 Files\Microsoft Visual Studio 10.0\VC\BIN\cl.exe /c /nologo /Ox /MD/
W3 /GS- /DNDEBUG -Iagg2/include -IC:\Python34\include -IC:\Python34\include /Tpa 
ggdraw.cxx /Fobuild\temp.win32-3.4\Release\aggdraw.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:\python34\include\object.h(334) : see declaration of '_typeobject' 
aggdraw.cxx(1912) : error C2039: 'ob_type' : is not a member of '_typeobject' 
     c:\python34\include\object.h(334) : see declaration of '_typeobject' 
aggdraw.cxx(1913) : error C2039: 'ob_type' : is not a member of '_typeobject' 
     c:\python34\include\object.h(334) : see declaration of '_typeobject' 
aggdraw.cxx(1913) : error C2039: 'ob_type' : is not a member of '_typeobject' 
     c:\python34\include\object.h(334) : see declaration of '_typeobject' 
aggdraw.cxx(1913) : error C2039: 'ob_type' : is not a member of '_typeobject' 
     c:\python34\include\object.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 

回答

0

在根據以前的答案不斷擴大的利益,也有很多的功能,其採取行動在Py2.7字符串,現在請在PY 3個字節或Unicode行動。同樣,所提到的int現在可以指long。作爲這個導致問題的一個例子,pyString_Check已被pyBytes_Check棄用。閱讀以下內容瞭解更多詳情:

https://docs.python.org/3/howto/cporting.html?highlight=pystring