2010-07-08 20 views
11

Ho qualche problema con PyQt/SIP. Immagino che il SIP sia compilato a 64 bit, ma Python ha qualche problema nel trovarlo.Come verificare se una libreria è basata su 32 bit/64 bit su Mac OS X?

 
    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 
  • Come faccio a sapere se una libreria (in modo da/dylib) è 32bit o 64bit?
  • Come faccio a sapere se il mio Python è a 32 bit oa 64 bit?
+1

possibile duplicato di [Determinare se un eseguibile (o una libreria) è 32 -o 64-bit (su OSX)] (http://stackoverflow.com/questions/1941825/determine-if-an-executable-or- library-is-32-or-64-bit-on-osx) – outis

risposta

16

Lo strumento file può essere utilizzato per identificare i file eseguibili.

Esempio:

> 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

per trovare le architetture disponibili nell'istanza Python che si sta utilizzando:

$ 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 

Per trovare se il Python è attualmente in esecuzione a 32-bit o 64-bit (10.6 esempi):

$ /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 

per python3, sostituto sys.maxsize per 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 

o

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

Non utilizzare file.

+0

"Non utilizzare' file'. " perché? – chakrit

+1

@chakrit 'file' non funziona su tutti i tipi di libreria. Suppone i formati, quindi vedrai questo: 'libn.a: libreria casuale di archivio ar corrente' per una libreria statica, dove la vedrai da 'lipo': 'File non grasso: libn.a è architettura: x86_64' . Per alcuni tipi di file funziona, ma perché usare uno strumento che * indovina * al tipo di file usando alcuni "test di magia" (vedi file man), invece di lipo, lo strumento che esiste esplicitamente per questo scopo? – Doug

+0

grazie per aver spiegato! – chakrit