2010-07-08 15 views
11

Tengo algunos problemas para usar PyQt/SIP. Supongo que el SIP está compilado en 64 bits, pero Python tiene algún problema para encontrarlo.¿Cómo comprobar si una biblioteca tiene 32 bits/64 bits incorporados en 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 
  • ¿Cómo puedo saber si una biblioteca (de modo/dylib) es 32 o 64 bits?
  • ¿Cómo puedo saber si mi Python es de 32 bits o de 64 bits?
+1

posible duplicado de [Determinar si un archivo ejecutable (o biblioteca) es de 32 o 64 bits (en OSX)] (http://stackoverflow.com/questions/1941825/determine-if-an-executable-or- library-is-32-or-64-bits-on-osx) – outis

Respuesta

16

La herramienta file se puede utilizar para identificar ejecutables.

Ejemplo:

> 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

para encontrar las arquitecturas disponibles en la instancia de Python que esté utilizando:

$ 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 

Para saber si el pitón se está ejecutando actualmente de 32 bits o 64 bits (10,6 ejemplos):

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

para python3, sustituto sys.maxsize para 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 

No utilice file.

+0

"No use' file'. " ¿por qué? – chakrit

+1

@chakrit 'file' no funciona en todos los tipos de biblioteca. Adivina formatos, por lo que verá esto: 'libn.a: biblioteca ar actual de archivos aleatorios' para una biblioteca estática, donde verá esto de 'lipo': 'Archivo no graso: libn.a es arquitectura: x86_64 '. Para algunos tipos de archivos funciona, pero ¿por qué usar una herramienta que * adivina * en el tipo de archivo usando algunas 'pruebas mágicas' (ver archivo man), en lugar de lipo, la herramienta que explícitamente existe para este propósito? – Doug

+0

¡gracias por explicarme! – chakrit

Cuestiones relacionadas