2010-07-08 11 views
11

Ich habe Probleme mit PyQt/SIP. Ich denke das SIP ist in 64bit kompiliert, aber Python hat ein Problem damit es zu finden.Wie überprüft man, ob eine Bibliothek 32bit/64bit unter Mac OS X erstellt?

 
    File "qtdemo.py", line 46, in 
    import sip 
ImportError: dlopen(/Library/Python/2.6/site-packages/sip.so, 2): no suitable image found. Did find: 
     /Library/Python/2.6/site-packages/sip.so: mach-o, but wrong architecture 
  • Wie kann ich wissen, ob eine Bibliothek (so/dylib) 32bit oder 64bit ist?
  • Woher weiß ich, ob mein Python 32bit oder 64bit ist?
+1

möglich Duplikat von [Ermitteln, ob eine ausführbare Datei (oder Bibliothek) 32 -oder 64-Bit (unter OSX) ist] (http://stackoverflow.com/questions/1941825/determine-if-an-executable-oder- library-is-32-or-64-bits-on-osx) – outis

Antwort

16

Das Tool file kann zum Identifizieren von ausführbaren Dateien verwendet werden.

Beispiel:

> file /Applications/TextEdit.app/Contents/MacOS/TextEdit 
/Applications/TextEdit.app/Contents/MacOS/TextEdit: Mach-O universal binary with 2 architectures 
/Applications/TextEdit.app/Contents/MacOS/TextEdit (for architecture x86_64): Mach-O 64-bit executable x86_64 
/Applications/TextEdit.app/Contents/MacOS/TextEdit (for architecture i386): Mach-O executable i386 
6

Um die verfügbaren Architekturen in der Python-Instanz finden Sie verwenden:

$ file "$("$(which python)" -c "import sys;print(sys.executable)")" 
/usr/bin/python: Mach-O universal binary with 3 architectures 
/usr/bin/python (for architecture x86_64): Mach-O 64-bit executable x86_64 
/usr/bin/python (for architecture i386): Mach-O executable i386 
/usr/bin/python (for architecture ppc7400): Mach-O executable ppc 

Um festzustellen, ob der Python zur Zeit 32-Bit oder 64-Bit läuft (10.6 Beispiele):

$ /usr/bin/python2.6 -c "import sys;print('%x'%sys.maxint)" 
7fffffffffffffff 
$ arch -x86_64 /usr/bin/python2.6 -c "import sys;print('%x'%sys.maxint)" 
7fffffffffffffff 
$ arch -i386 /usr/bin/python2.6 -c "import sys;print('%x'%sys.maxint)" 
7fffffff 
$ arch -ppc /usr/bin/python2.6 -c "import sys;print('%x'%sys.maxint)" 
7fffffff 

für python3, Ersatz sys.maxsize für sys.maxint:

$ python3 -c "import sys;print('%x'%sys.maxsize)" 
7fffffff 
5
lipo -info target/libexample-df07142d9bfd950a.a 
input file target/libexample-df07142d9bfd950a.a is not a fat file 
Non-fat file: target/libexample-df07142d9bfd950a.a is architecture: x86_64 

oder

lipo -info `which python` 
Non-fat file: /usr/local/bin/python is architecture: x86_64 

Verwenden file nicht.

+0

"Verwenden Sie' Datei' nicht. " Warum? – chakrit

+1

@chakrit 'Datei' funktioniert nicht bei allen Bibliothekstypen. Es rät Formate, so dass Sie folgendes sehen: 'libn.a: current arch archive random library' für eine statische Bibliothek, wo Sie das von 'lipo' sehen: 'Nicht-fette Datei: libn.a ist Architektur: x86_64 '. Für einige Dateitypen funktioniert es, aber warum sollte man ein Werkzeug benutzen, das * am Dateityp mit einigen "magischen Tests" (siehe man-Datei) statt mit lipo, dem Werkzeug, das explizit für diesen Zweck existiert, verwendet? – Doug

+0

danke für die Erklärung! – chakrit