PyObjC + Xcode 3.2 + 非苹果Python

2 投票
1 回答
1374 浏览
提问于 2025-04-15 19:03

我想开始用PyObjC开发一些简单的应用程序。我已经安装了PyObjC和Xcode模板。我知道PyObjC本身是可以用的,因为我成功运行了这个脚本。但是,当我尝试从Cocoa-Python应用程序模板创建一个项目并运行时,我遇到了这个错误:

Traceback (most recent call last):
  File "main.py", line 10, in 
    import objc
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/PyObjC/objc/__init__.py", line 25, in 
    from _convenience import *
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/PyObjC/objc/_convenience.py", line 21, in 
    from itertools import imap
ImportError: dlopen(/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload/itertools.so, 2): no suitable image found.  Did find:
    /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload/itertools.so: mach-o, but wrong architecture
2010-02-08 19:40:09.280 TestApplication[3229:a0f] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '/Users/icktoofay/Desktop/TestApplication/main.m:44 main() PyRun_SimpleFile failed with file '/Users/icktoofay/Desktop/TestApplication/build/Debug/TestApplication.app/Contents/Resources/main.py'.  See console for errors.'

我尝试打开一个普通的Python提示符并导入itertools时,没有出现错误。我使用的是Mac OS X 10.6 Snow Leopard上的MacPorts提供的Python 2.6.4。

如果有人能帮忙,我会非常感激。

1 个回答

3

你遇到了一个32位和64位的问题。看起来你是在MacPorts上安装的Python 2.6,而这个版本似乎不是一个通用的(32位/64位)版本。也就是说,要么你的应用程序是64位的,而Python只有32位,要么反过来。你可以通过使用file命令来检查一下:

cd /opt/local/Library/Frameworks/Python.framework/Versions/2.6/
cd lib/python2.6/lib-dynload/
file itertools.so 
itertools.so: Mach-O universal binary with 2 architectures
itertools.so (for architecture x86_64): Mach-O 64-bit bundle x86_64
itertools.so (for architecture i386):   Mach-O bundle i386

最简单的解决办法可能是重新安装MacPorts的Python,以及你安装的其他包,比如PyObjC:

sudo port selfupdate
sudo port -u install python26 +universal ...

编辑:因为你说Python是64位的,那么问题几乎肯定是由于Xcode模板设置的问题,特别是针对你的Python PyObjC项目。启动代码可能在加载苹果提供的Python解释器,而这个解释器是通用的。你可以在import objc之前加上类似这样的代码来检查:

import sys
sys.stderr.write(sys.executable)

对于MacPorts来说,应该是

/opt/local/Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python

我对在Xcode下使用模板的细节不太熟悉,所以不太清楚需要改动什么,而且我怀疑很多人会在MacPorts的Python下使用这些模板,尤其是在10.6版本下。

还有一个想法,苹果提供的Python 2.6.1已经自带了一个版本的PyObjC。也许使用它会更简单。或者不使用Xcode,而是用py2app或其他解决方案来运行它。

撰写回答