Alex Rivera | Logout

"no matching architecture in universal wrapper" problem in wxPython?

Asked 2010-08-31T07:38:45.917
12

I am running Python 2.7 under Mac OS 10.6.4, and I just installed wxPython from the wxPython2.8-osx-unicode-2.8.11.0-universal-py2.7.dmg binary. I am getting a weird error on the import wx line in my Python scripts. FYI, I can import the wx module just fine from PyCrust. I don't really see what I have done wrong here. Could anyone please assist?

  File "prod_cons_wx.py", line 6, in <module>
    import wx 
  File "/usr/local/lib/wxPython-unicode-2.8.11.0/lib/python2.7/site-packages/wx-2.8-mac-unicode/wx/__init__.py", line 45, in <module>
    from wx._core import *
  File "/usr/local/lib/wxPython-unicode-2.8.11.0/lib/python2.7/site-packages/wx-2.8-mac-unicode/wx/_core.py", line 4, in <module>
    import _core_
ImportError: dlopen(/usr/local/lib/wxPython-unicode-2.8.11.0/lib/python2.7/site-packages/wx-2.8-mac-unicode/wx/_core_.so, 2): no suitable image found.  Did find:
    /usr/local/lib/wxPython-unicode-2.8.11.0/lib/python2.7/site-packages/wx-2.8-mac-unicode/wx/_core_.so: no matching architecture in universal wrapper
Edit
Report

2 Answers

9

It appears that C extension modules included with the wxPython 2.7 dmg here are 32-bit only.

$ cd /usr/local/lib/wxPython-unicode-2.8.11.0/lib/python2.7/site-packages/wx-2.8-mac-unicode/wx
$ file *.so
_animate.so:   Mach-O universal binary with 2 architectures
_animate.so (for architecture ppc): Mach-O bundle ppc
_animate.so (for architecture i386):    Mach-O bundle i386
_aui.so:       Mach-O universal binary with 2 architectures
_aui.so (for architecture ppc): Mach-O bundle ppc
_aui.so (for architecture i386):    Mach-O bundle i386
...

Unfortunately, platform.architecture() does not give an accurate indication of which arch an OS X multiple architecture Python is running in. For example, using the 3-arch python.org installer for Python 2.7, platform.architecture() always reports 64-bit even when running in 32-bit mode:

$ cd /Library/Frameworks/Python.framework/Versions/2.7
$ file python2.7
python2.7: Mach-O universal binary with 3 architectures
python2.7 (for architecture i386):  Mach-O executable i386
python2.7 (for architecture ppc7400):   Mach-O executable ppc
python2.7 (for architecture x86_64):    Mach-O 64-bit executable x86_64
$ arch -x86_64 ./python2.7 -c 'import platform, sys; print "{0}, {1:x}".format(platform.architecture()[0], sys.maxint)'
64bit, 7fffffffffffffff
$ arch -i386 ./python2.7 -c 'import platform, sys; print "{0}, {1:x}".format(platform.architecture()[0], sys.maxint)'
64bit, 7fffffff
$ arch -ppc ./python2.7 -c 'import platform, sys; print "{0}, {1:x}".format(platform.architecture()[0], sys.maxint)'
64bit, 7fffffff

The reliable way is to examine sys.maxint for Python 2 or sys.maxsize for Python 3.

You don't indicate in your question how you invoke Python. Is it via a shebang line in a script file? If so, you may not be running the Python you thi

answered 2010-08-31T08:50:38.347
4

Just to clarify 'Ned Deily's' suggestion re: use arch -i386 python2.7 script.py to run in 32-bit mode. The exact command line is arch -i386 python pywrap spare.py. This will allow you to run PyCrust (in 32-bit mode on OSX 10.6.x).

answered 2011-03-26T22:37:15.890

Your Answer