简体   繁体   中英

WxPython Incompatible With Snow Leopard?

Recently I upgraded to Snow Leopard, and now I can't run programs built with wxPython. The errors I get are (from Eclipse + PyDev):

  import wx 
  File "/var/tmp/wxWidgets/wxWidgets-13~231/2.6/DSTROOT/System/Library/Frameworks
  /Python.framework/Versions/2.6/Extras/lib/
  python/wx-2.8-mac-unicode/wx/__init__.py", line 45, in <module>

  File "/var/tmp/wxWidgets/wxWidgets-13~231/2.6/DSTROOT
  /System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib
  /python/wx-2.8-mac-unicode/wx/_core.py", line 4, in <module>
  ImportError:/System/Library/Frameworks
  /Python.framework/Versions/2.6/Extras/lib/python
  /wx-2.8-mac-unicode/wx/_core_.so: no appropriate 64-bit architecture 
  (see "man python" for running in 32-bit mode)

I don't really understand them and would appreciate if you could help me to do so, also, if you do know what's going on, how can I go about fixing them? Maybe this has something to do with the fact that Snow Leopard is 64-bit?

Thanks!!

The problem is that WxPython is only available on the Mac in 32-bit mode; however, by default, Python will start up in 64-bit mode. To fix this problem, create the following shell script named python_32 :

#! /bin/bash
export VERSIONER_PYTHON_PREFER_32_BIT=yes
/usr/bin/python "$@"

Make the script executable ( chmod a+x python_32 ) and place the script in your path. Now, simply invoke python_32 to get an interactive Python console in which you can use WxPython. If you want to write a Python script that uses this, you can use the shebang: #! /usr/bin/env python_32 #! /usr/bin/env python_32 .

Now to explain... the basic problem is that 32-bit and 64-bit code uses a different application binary interface (ABI), and so 32-bit code and 64-bit code cannot coexist in the same library/executable/process. In order to support 64-bit mode, it needs to have been compiled in 64-bit mode; likewise, to support 32-bit mode, it needs to have been compiled in 32-bit mode. Under OS X, it is possible, using universal binaries to support both... however, it needs to be compiled in both modes (and then merged). WxWidgets probably uses Carbon, which is only available in 32-bit mode (Cocoa is available in both 32-bit and 64-bit mode... Apple didn't bother making Carbon available in both modes, since it is being deprecated), which would explain why WxPython, in turn, could only be provided in 32-bit mode. This, in turn, means that using it in Python requires you to launch Python in 32-bit mode (Python is a universal binary with both 32-bit and 64-bit versions of itself available in the same binary file, so it can be launched in either mode).


I don't recommend doing this, because I think you should leave the defaults as they are, but since you might not have enough shell scripting knowledge (you need to use "./python_32" or place it in a folder that is listed in your "$PATH" environment variable and invoke it as "python_32") to follow the former option, you might want to simply execute the following command which will make 32-bit mode the default:

defaults write com.apple.versioner.python Prefer-32-Bit -bool yes

If you decide you want to switch back into 64-bit mode, you can then use the following command:

defaults write com.apple.versioner.python Prefer-32-Bit -bool no

Note that both commands are to be executed on the Terminal (not within Python).


I should point out that both recomendations are based on man python on Mac OS X. So, if you have any other questions, you should definitely read the man page as the error message has urged you to do.

While I see this is already answered, the answer is slightly wrong. The 2.9 series DOES have a Mac 64-bit build, albeit only for Python 2.7. See http://wxpython.org/download.php and look for the Cocoa build. From what I gather on the wxPython mailing list and IRC channel, you'll want to download a Python 64-bit build from python.org rather than using the Mac-included snake.

You might also want to try arch command when invoking python: arch -i386 /usr/bin/python2.6 if you can't get Python to run with the correct environmental settings. The '-i386' switch makes a universal binary run in Intel 32-bit mode. '-x86_64' makes it run in Intel 64-bit mode. -ppc and -ppc64 is for PPC architectures.

If you still get errors then it might point to a compile issue. On my machine I have the stock apple Python and a version from Macports. The arch command works using the apple binaries and I can import wx successfully from the command line but I still get errors from the Macports binary: Bad CPU type in executable I'm guessing I'll have to go back and recompile my Macports python binary and make sure it produces a universal binary or something like that (sigh).

Another solution is to download and install Python 2.6 for OS X from python.org and install wxPython for OS X from here with it. The python.org 2.6 is newer (2.6.5 as of now) than the Apple-supplied Python (2.6.1) in Snow Leopard and it is 32-bit only.

This worked for me (from http://www.python-forum.de/viewtopic.php?f=19&t=24322&view=previous )

In .profile, add the following line alias py32='arch -i386 /Library/Frameworks/Python.framework/Versions/2.7/bin/pythonw2.7'

then invoke your script with py32

Hm. The script provided didn't work for me-- I changed it as follows:

#! /bin/bash
echo "-----------------Python 2.6 - 32 Bit setup --------------------"
echo "Running" $1
export VERSIONER_PYTHON_PREFER_32_BIT yes
/usr/bin/python2.6 $1

Still didn't work. I get the same message. Re-read the man page to make sure I wasn't misunderstanding, and I'm no further forward:

ImportError: /usr/local/lib/wxPython-unicode-2.8.10.1/lib/python2.6/site-packages/wx-2.8-mac-unicode/wx/_core_.so: no appropriate 64-bit architecture (see "man python" for running in 32-bit mode)

Not really sure why this doesn't work, unless there is some sort of rebuild that needs to be done against the wx core that gives it 32/64-bit compatibility. Any suggestions, anyone? I'd like to use the out-of-the-box Python install from Apple (be easier for my work), and I'd like to avoid any more ridiculous hacks

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM