PyObjC + Xcode 3.2 + Nicht-Apple-Python
Frage
Ich will versuchen, begann ein paar einfache Anwendungen mit PyObjC zu entwickeln. Ich installierte PyObjC und die Xcode-Vorlagen. Ich weiß, dass PyObjC selbst funktioniert, da ich habe laufen dieses Skript erfolgreich. Als ich versuchte, ein Projekt aus der Cocoa-Python-Anwendungsvorlage zu erstellen und es lief, habe ich diesen Fehler:
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.'
Als ich versuchte, eine normale Python-Prompt öffnen und itertools
importieren, es war kein Fehler. Ich verwende Python 2.6.4 von MacPorts auf Mac OS X 10.6 Snow Leopard.
ich Hilfe schätzen würde.
Lösung
Sie haben eine 32-Bit-vs 64-Bit-Problem. Es scheint, dass Sie eine Python 2.6 von MacPorts installiert verwenden, und offenbar war es kein Universal (32-Bit / 64-Bit) zu bauen. Entweder Ihre Anwendung läuft als 64-Bit- und der Python ist nur 32-Bit oder umgekehrt. Sie können überprüfen, indem file
mit:
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
Die einfachste Lösung ist wahrscheinlich die MacPorts Python und die zusätzlichen Pakete, die Sie wie PyObjC installiert neu installieren:
sudo port selfupdate
sudo port -u install python26 +universal ...
EDIT: Da Sie berichten, dass die Python 64-Bit ist, dann ist das Problem mit ziemlicher Sicherheit ist aufgrund eines Problems mit dem Xcode Template-Setup für Ihre Python PyObjC Projekt. Der Startup-Code wird geladen wahrscheinlich den von Apple bereitgestellten Python-Interpreter, der universell ist. Sie können überprüfen, indem Sie so etwas wie dies vor dem import objc
fügte hinzu:
import sys
sys.stderr.write(sys.executable)
Für MacPorts, sollte es sein
/opt/local/Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python
Ich bin nicht vertraut genug mit den ins-and-outs von den Vorlagen unter Xcode zu wissen, was geändert werden könnte müssen und ich bezweifle, dass viele Leute sie mit einem MacPorts Python verwenden, insbesondere unter 10.6.
Ein weiterer Gedanke, das Apple-suppied Python 2.6.1 kommt mit einer Version von PyObjC bereits installiert. Vielleicht ist es mit wäre einfacher. Oder verwenden Sie nicht Xcode und Verwendung py2app
oder eine andere Lösung, um sie auszuführen.