WxPython与雪豹不兼容?

18 投票
6 回答
13193 浏览
提问于 2025-04-15 21:09

最近我升级到了Snow Leopard系统,现在我无法运行用wxPython编写的程序。我在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)

我其实不太明白这些错误的意思,如果你能帮我理解一下就太好了。另外,如果你知道发生了什么,我该怎么解决这些问题呢?也许这和Snow Leopard是64位的有关?

谢谢!!

6 个回答

2

如果你在运行Python的时候遇到问题,可能可以试试用arch命令来启动Python:arch -i386 /usr/bin/python2.6。这个命令的'-i386'选项是让程序在Intel的32位模式下运行。'-x86_64'则是让它在64位模式下运行。'-ppc'和'-ppc64'是针对PPC架构的。

如果你还是遇到错误,那可能是编译方面的问题。在我的电脑上,我有苹果自带的Python和一个来自Macports的版本。用arch命令可以正常使用苹果的版本,并且我可以从命令行成功导入wx库,但在使用Macports的版本时却出现了错误:Bad CPU type in executable。我猜我得回去重新编译一下Macports的Python版本,确保它能生成一个通用的二进制文件之类的(唉)。

15

虽然我看到这个问题已经有人回答了,但那个回答有点不准确。2.9系列确实有适用于Mac的64位版本,不过仅限于Python 2.7。你可以去http://wxpython.org/download.php看看,找找Cocoa版本。从我在wxPython的邮件列表和IRC频道了解到的情况,你最好从python.org下载一个64位的Python版本,而不是使用Mac自带的那个蛇。

25

问题是,WxPython在Mac上只能以32位模式运行;而默认情况下,Python会以64位模式启动。要解决这个问题,你需要创建一个名为python_32的脚本:

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

让这个脚本可以执行(使用chmod a+x python_32命令),然后把它放到你的路径中。现在,只需输入python_32,就可以打开一个可以使用WxPython的Python交互式控制台。如果你想写一个使用这个的Python脚本,可以在脚本开头加上这行:#! /usr/bin/env python_32

接下来解释一下……基本问题是32位和64位的代码使用不同的应用程序二进制接口(ABI),所以32位代码和64位代码不能在同一个库、可执行文件或进程中共存。为了支持64位模式,代码必须以64位模式编译;同样,支持32位模式的代码也必须以32位模式编译。在OS X下,可以使用通用二进制文件来同时支持这两种模式……但是需要同时编译这两种模式(然后合并)。WxWidgets可能使用了Carbon,而Carbon只能在32位模式下使用(Cocoa在32位和64位模式下都可以使用……苹果没有把Carbon做成双模式,因为它已经被淘汰),这就解释了为什么WxPython只能以32位模式提供。因此,在Python中使用它就需要以32位模式启动Python(Python是一个通用二进制文件,里面同时包含32位和64位版本,所以可以以任意一种模式启动)。

替代选项
我不建议这样做,因为我觉得你应该保持默认设置不变,但如果你可能对shell脚本的知识不够(你需要使用"./python_32"或者把它放在"$PATH"环境变量中列出的文件夹里,然后用"python_32"来调用它),你可以简单地执行以下命令,这样就可以把32位模式设为默认:

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

如果你决定想要切换回64位模式,可以使用以下命令:

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

请注意,这两个命令都要在终端中执行(而不是在Python内部)。

来源
我应该指出,这两个建议都是基于man python在Mac OS X上的内容。所以,如果你有其他问题,绝对应该阅读这个手册页面,因为错误信息也建议你这样做。

撰写回答