Porting Python2 C-API/Swig based modules to Python 3
Hello, I am trying to get a compiled module to work with Python3. The code I am compiling was originally intended to be used in a Python 2.* environment, but I updated all the Python 2.* elements and the swig commands used by the setup.py script. I got the library to successfully compile, but I am getting the following errors on import (below). I am not sure how to trouble shoot this problem, and the fact that only one symbol (_PyCObject_FromVoidPtr) is missing is disconcerting. I Googled some, but the symbol mentioned only showed up in a few posts, where linking was an issue. I have also gone through the setup.py script and explicitly defined all the library paths. My questions: - Has anyone ever ported Python 2* modules/libs to Python 3 that rely on swig, and are there some changes in the C-API/swig I need to be looking for to make this port successful? - Does anyone have any advice/insght about how I can troubleshoot, diagnose, and resolve this issue? Thanks in advance, -- Adam 0:pylibpcap-0.6.2$ python3 Python 3.2 (r32:88452, Feb 20 2011, 11:12:31) [GCC 4.2.1 (Apple Inc. build 5664)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import pcap,py Traceback (most recent call last): File "", line 1, in File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/pcap.py", line 25, in _pcap = swig_import_helper() File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/pcap.py", line 21, in swig_import_helper _mod = imp.load_module('_pcap', fp, pathname, description) ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/_pcapmodule.so, 2): Symbol not found: _PyCObject_FromVoidPtr Referenced from: /Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/_pcapmodule.so Expected in: flat namespace in /Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/_pcapmodule.so >>> ^D -- http://mail.python.org/mailman/listinfo/python-list
Re: Porting Python2 C-API/Swig based modules to Python 3
Thanks for the help. That information got me started in the right direction. I put my notes up on paste bin for others to use in the future. For the future reference of others, I have included the pertinent details below. My process for identifying the various issues was compiling and running the project to see what was still broken after each fix. I know this is not the most efficient way, but it worked for this pylibcap since the code base was pretty small. I don't think everything is completely fixed, but its a step in the right direction. The initial hurdle I encountered was swig. I had to modify swig's code output, because it was not using the PyCapsule_* API yet. I found someones solution here: http://paste.pocoo.org/show/253494/. After applying that fix, I found that the pcap_interface.c and pcap.i files in the project were using some deprecated API calls. So I converted the following APIs: PyLong_AS_INT ==> PyLong_AsLong PyInt_* ==> PyLong_* PyString_* ==> PyBytes_* (initialily changed to PyUnicode_* but that was wrong, because I needed the Raw Bytes) I also had to change s# to y#. Before, s# stood for string and #, but it now means unicode and number. Hopefully these details will be helpful to others in the future. Thanks again for the nudge, -- Adam. On Wed, Feb 23, 2011 at 11:58 AM, casevh wrote: > On Feb 23, 8:54 am, Adam Pridgen > wrote: >> Hello, >> >> I am trying to get a compiled module to work with Python3. The code I >> am compiling was originally intended to be used in a Python 2.* >> environment, but I updated all the Python 2.* elements and the swig >> commands used by the setup.py script. I got the library to >> successfully compile, but I am getting the following errors on import >> (below). I am not sure how to trouble shoot this problem, and the >> fact that only one symbol (_PyCObject_FromVoidPtr) is missing is >> disconcerting. I Googled some, but the symbol mentioned only showed >> up in a few posts, where linking was an issue. I have also gone >> through the setup.py script and explicitly defined all the library >> paths. >> >> My questions: >> >> - Has anyone ever ported Python 2* modules/libs to Python 3 that rely >> on swig, and are there some changes in the C-API/swig I need to be >> looking for to make this port successful? >> >> - Does anyone have any advice/insght about how I can troubleshoot, >> diagnose, and resolve this issue? >> >> Thanks in advance, >> >> -- Adam >> >> >> >> 0:pylibpcap-0.6.2$ python3 >> Python 3.2 (r32:88452, Feb 20 2011, 11:12:31) >> [GCC 4.2.1 (Apple Inc. build 5664)] on darwin >> Type "help", "copyright", "credits" or "license" for more information.>>> >> import pcap,py >> >> Traceback (most recent call last): >> File "", line 1, in >> File >> "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/pcap.py", >> line 25, in >> _pcap = swig_import_helper() >> File >> "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/pcap.py", >> line 21, in swig_import_helper >> _mod = imp.load_module('_pcap', fp, pathname, description) >> ImportError: >> dlopen(/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/_pcapmodule.so, >> 2): Symbol not found: _PyCObject_FromVoidPtr >> Referenced from: >> /Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/_pcapmodule.so >> Expected in: flat namespace >> in >> /Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/_pcapmodule.so >> >> >> >> >>> ^D- Hide quoted text - >> >> - Show quoted text - > > This is a change in the C-API in 3.2. See http://bugs.python.org/issue5630 > > casevh > -- > http://mail.python.org/mailman/listinfo/python-list > -- http://mail.python.org/mailman/listinfo/python-list
Re: Porting Python2 C-API/Swig based modules to Python 3
Link to pastebin: http://pastebin.com/102fhkgp On Wed, Feb 23, 2011 at 6:18 PM, Adam Pridgen wrote: > Thanks for the help. That information got me started in the right > direction. I put my notes up on paste bin for others to use in the > future. > > For the future reference of others, I have included the pertinent > details below. My process for identifying the various issues was > compiling and running the project to see what was still broken after > each fix. I know this is not the most efficient way, but it worked > for this pylibcap since the code base was pretty small. I don't think > everything is completely fixed, but its a step in the right direction. > > The initial hurdle I encountered was swig. I had to modify swig's > code output, because it was not using the PyCapsule_* API yet. I > found someones solution here: http://paste.pocoo.org/show/253494/. > After applying that fix, I found that the pcap_interface.c and pcap.i > files in the project were using some deprecated API calls. So I > converted the following APIs: > > PyLong_AS_INT ==> PyLong_AsLong > PyInt_* ==> PyLong_* > PyString_* ==> PyBytes_* (initialily changed to PyUnicode_* but that > was wrong, because I needed the Raw Bytes) > > I also had to change s# to y#. Before, s# stood for string and #, but > it now means unicode and number. > > > > Hopefully these details will be helpful to others in the future. > Thanks again for the nudge, > > -- Adam. > > On Wed, Feb 23, 2011 at 11:58 AM, casevh wrote: >> On Feb 23, 8:54 am, Adam Pridgen >> wrote: >>> Hello, >>> >>> I am trying to get a compiled module to work with Python3. The code I >>> am compiling was originally intended to be used in a Python 2.* >>> environment, but I updated all the Python 2.* elements and the swig >>> commands used by the setup.py script. I got the library to >>> successfully compile, but I am getting the following errors on import >>> (below). I am not sure how to trouble shoot this problem, and the >>> fact that only one symbol (_PyCObject_FromVoidPtr) is missing is >>> disconcerting. I Googled some, but the symbol mentioned only showed >>> up in a few posts, where linking was an issue. I have also gone >>> through the setup.py script and explicitly defined all the library >>> paths. >>> >>> My questions: >>> >>> - Has anyone ever ported Python 2* modules/libs to Python 3 that rely >>> on swig, and are there some changes in the C-API/swig I need to be >>> looking for to make this port successful? >>> >>> - Does anyone have any advice/insght about how I can troubleshoot, >>> diagnose, and resolve this issue? >>> >>> Thanks in advance, >>> >>> -- Adam >>> >>> >>> >>> 0:pylibpcap-0.6.2$ python3 >>> Python 3.2 (r32:88452, Feb 20 2011, 11:12:31) >>> [GCC 4.2.1 (Apple Inc. build 5664)] on darwin >>> Type "help", "copyright", "credits" or "license" for more information.>>> >>> import pcap,py >>> >>> Traceback (most recent call last): >>> File "", line 1, in >>> File >>> "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/pcap.py", >>> line 25, in >>> _pcap = swig_import_helper() >>> File >>> "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/pcap.py", >>> line 21, in swig_import_helper >>> _mod = imp.load_module('_pcap', fp, pathname, description) >>> ImportError: >>> dlopen(/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/_pcapmodule.so, >>> 2): Symbol not found: _PyCObject_FromVoidPtr >>> Referenced from: >>> /Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/_pcapmodule.so >>> Expected in: flat namespace >>> in >>> /Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/_pcapmodule.so >>> >>> >>> >>> >>> ^D- Hide quoted text - >>> >>> - Show quoted text - >> >> This is a change in the C-API in 3.2. See http://bugs.python.org/issue5630 >> >> casevh >> -- >> http://mail.python.org/mailman/listinfo/python-list >> > -- http://mail.python.org/mailman/listinfo/python-list