wxPython中的“通用包装器中没有匹配的架构”问题?
我在 Mac OS 10.6.4 上运行 Python 2.7,刚刚从 wxPython2.8-osx-unicode-2.8.11.0-universal-py2.7.dmg
安装了 wxPython。现在在我的 Python 脚本中,执行 import wx
这一行时出现了奇怪的错误。顺便说一下,我可以在 PyCrust 中正常导入 wx 模块。我真的不知道自己哪里出错了。有人能帮帮我吗?
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
5 个回答
对于32位系统,有两个文件,分别是python2.7-32和pythonw2.7-32。
你可以用这两个文件来运行你的脚本。
我把python链接到了python2.7-32,把pythonw链接到了pythonw2.7-32。我的所有脚本都运行得很好。
你也可以试试看。
为了更清楚地说明一下'Ned Deily'的建议,使用 arch -i386 python2.7 script.py 来以32位模式运行。 具体的命令是 arch -i386 python pywrap spare.py。这样你就可以在OSX 10.6.x上以32位模式运行PyCrust。
看起来,wxPython 2.7 的 dmg 文件里包含的 C 扩展模块只能在 32 位系统上使用。
$ 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
...
不幸的是,platform.architecture()
这个函数并不能准确告诉你在 OS X 上运行的 Python 是哪个架构。例如,使用 python.org 提供的支持三种架构的 Python 2.7 安装包时,platform.architecture()
总是报告为 64 位,即使它实际上是在 32 位模式下运行:
$ 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
一个可靠的方法是检查 Python 2 的 sys.maxint
或 Python 3 的 sys.maxsize
。
你在提问时没有说明你是怎么启动 Python 的。是通过脚本文件里的 shebang 行吗?如果是这样,你可能并没有运行你想要的那个 Python。此外,你也没有说明你安装的是哪个版本的 Python 2.7。目前,python.org 提供了两个 Python 2.7 的安装包:一个支持 32 位和 64 位运行,另一个只支持 32 位。你可以尝试以下方法:
$ file $(python2.7 -c 'import sys;print(sys.executable)')
/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python: Mach-O universal binary with 3 architectures
/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python (for architecture i386): Mach-O executable i386
/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python (for architecture ppc7400): Mach-O executable ppc
/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python (for architecture x86_64): Mach-O 64-bit executable x86_64
所以,如果你有一个多架构版本的 Python,你需要强制它以 32 位模式运行,这样才能使用预编译的 wxPython。