¿Cómo determino si mi shell de Python se está ejecutando en modo de 32 bits o 64 bits en OS X?

420

Necesito una manera de saber en qué modo está el shell desde dentro del shell.

Intenté mirar el módulo de la plataforma , pero parece solo decirle "sobre la arquitectura de bits y el formato de enlace utilizado para el ejecutable": el binario se compila como 64 bits (estoy ejecutando en OS X 10.6) así que parece que siempre informa 64 bits, aunque estoy usando los métodos descritos aquí para forzar el modo 32 bits).

jkp
fuente
1
Solo por interés: ¿Por qué necesitas saber?
Lennart Regebro
2
Tengo problemas para construir y cargar algunos módulos en OS X 10.6. Específicamente pysco, que se queja de que estoy ejecutando en modo de 64 bits. Esto también está bajo virtualenv, así que hay algunas complicaciones adicionales por las que necesito trabajar ...
jkp
2
Me gustaría saberlo porque cuando uso algo como PyInstaller para crear un binario independiente distribuible (para dar a los usuarios que no tengan instalada (la versión correcta de) Python, el binario que produzco será de 32/64 bits dependiendo en Python con el que ejecuto PyInstaller. Idealmente, creo que me gustaría nombrar automáticamente el archivo binario / archivo resultante con '32' o '64' en el nombre del archivo, en lugar de tener que cambiar manualmente el nombre de los archivos dependiendo de dónde ejecutar el comando 'hacer' desde.
Jonathan Hartley

Respuestas:

411

Una forma es mirar sys.maxsizecomo se documenta aquí :

$ python-32 -c 'import sys;print("%x" % sys.maxsize, sys.maxsize > 2**32)'
('7fffffff', False)
$ python-64 -c 'import sys;print("%x" % sys.maxsize, sys.maxsize > 2**32)'
('7fffffffffffffff', True)

sys.maxsizefue introducido en Python 2.6. Si necesita una prueba para sistemas más antiguos, esta prueba un poco más complicada debería funcionar en todas las versiones de Python 2 y 3:

$ python-32 -c 'import struct;print( 8 * struct.calcsize("P"))'
32
$ python-64 -c 'import struct;print( 8 * struct.calcsize("P"))'
64

Por cierto, puede ser tentado a usar platform.architecture()para esto. Por desgracia, sus resultados no siempre son fiables, sobre todo en el caso de los binarios universales OS X .

$ arch -x86_64 /usr/bin/python2.6 -c 'import sys,platform; print platform.architecture()[0], sys.maxsize > 2**32'
64bit True
$ arch -i386 /usr/bin/python2.6 -c 'import sys,platform; print platform.architecture()[0], sys.maxsize > 2**32'
64bit False
Ned Deily
fuente
14
Usar sys.maxint no funcionará para detectar un Python de 64 bits cuando se ejecuta Windows (ver aquí ). En su lugar, use struct.calcsize ("P") para una solución multiplataforma.
Luke Moore el
Gracias por revisar. He revisado sustancialmente la respuesta para mostrar la sys.maxsizeprueba ahora documentada para Python 2.6+ y la structprueba utilizada por el platformmódulo que también funciona para versiones anteriores de Python 2.
Ned Deily
Esto no funciona en IronPython, sys.maxsize es 2 ** 31 para IronPython de 32 bits y 64 bits
Meh
44
Yinon, eso es cierto, pero esa no es la pregunta que se hizo. Y, en aquellas CPU donde es posible ejecutar, por ejemplo, binarios de 32 bits o de 64 bits, el arco de la máquina generalmente no es tan relevante para un programa Python; lo que importa es en qué arco se está ejecutando el intérprete de Python.
Ned Deily
66
En el cmd de Windows, debe poner las comillas dobles en el exterior y las comillas simples en el interior o de lo contrario se producirá un error de sintaxis. Probablemente sea porque Windows piensa que los espacios entre comillas simples siguen siendo delimitadores de argumentos. Puede ser útil ajustar esta respuesta para acomodar ese hecho.
Steven Bluen
255

Al iniciar el intérprete de Python en la línea de terminal / comando, también puede ver una línea como:

Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win32

Donde [MSC v.1500 64 bit (AMD64)]significa Python de 64 bits. Funciona para mi configuración particular.

Dustin
fuente
66
entonces esto es lo que? ¿Pitón de 64 bits o pitón de 32 bits?
phpJs
99
@phpJs 64 bit debido a[MSC v.1500 64 bit (AMD64)]
Eduard Florinescu
19
Lamentablemente, solo funciona para las versiones de Windows de Python. Mi instalación de OSX regresaPython 2.7.8 (v2.7.8:ee879c0ffa11, Jun 29, 2014, 21:07:35) [GCC 4.2.1 (Apple In. build 5666) (dot 3)] on darwin
aodj
66
En cygwin, obtienes esta respuesta:Python 2.7.8 (default, Jul 25 2014, 14:04:36) [GCC 4.8.3] on cygwin
Jonno_FTW
1
Esta información se puede encontrar en el código llamando sys.version. Me sale por ejemplo ('3.4.4 |Continuum Analytics, Inc.| (default, Feb 16 2016, 09:54:04) [MSC ' 'v.1600 64 bit (AMD64)]')o2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)]
otterb
191

Básicamente, una variante de la respuesta de Matthew Marshall (con una estructura de la biblioteca estándar):

import struct
print struct.calcsize("P") * 8
ChristopheD
fuente
1
Imho, mejor que la versión ctypes: funciona incluso con Python anterior.
yk4ever
77
Muy útil, se puede usar en una línea. $ python -c 'import struct; print struct.calcsize ("P") * 8 '
Sun Liwen
1
print (struct.calcsize ("P") * 8) es mejor.
HolaMundo
2
así que copie y pegue en línea para Python3:python -c "import struct; print(struct.calcsize('P')*8)"
Neinstein
78

Intente usar ctypes para obtener el tamaño de un puntero vacío:

import ctypes
print ctypes.sizeof(ctypes.c_voidp)

Será 4 para 32 bits u 8 para 64 bits.

Matthew Marshall
fuente
1
Eso también funciona, aunque tiene la posible pequeña desventaja de una importación innecesaria y una carga de módulo si no necesita otros tipos: el módulo sys, otoh, se compila en el intérprete.
Ned Deily
por favor ayúdame a entender: en mi instalación 64b python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp)'devuelve 8 . ¿O debería ser python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp) * 8'?
lukmdo
La función devuelve el tamaño en bytes (4 u 8). Si necesita el tamaño en bits (32 o 64), debe multiplicarlo por 8. b_is_python_64bit = (ctypes.sizeof (ctypes.c_voidp) == 8)
phobie
1
Solo llamepython -c "import ctypes; print(32 if ctypes.sizeof(ctypes.c_voidp)==4 else 64, 'bit CPU')"
vitiral
55

Consola Python abierta:

import platform
platform.architecture()[0]

debería mostrar el '64bit' o '32bit' de acuerdo con su plataforma.

Alternativamente ( en el caso de los binarios de OS X ):

import sys
sys.maxsize > 2**32 
# it should display True in case of 64bit and False in case of 32bit
abe312
fuente
el módulo patform no siempre es confiable, consulte los documentos docs.python.org/2/library/platform.html, esto también es cierto para algunas aplicaciones de Windows
GM
18

Para una solución no programática, busque en el Monitor de actividad. Enumera la arquitectura de los procesos de 64 bits como "Intel (64 bits)".

Peter Hosey
fuente
1
Una respuesta alternativa muy agradable para aquellos de nosotros que usamos Mac OS 10.xx ¡Gracias!
mkelley33
16

En mi sistema Centos Linux hice lo siguiente:

1) Comencé el intérprete de Python (estoy usando 2.6.6)
2) Ejecuté el siguiente código:

import platform
print(platform.architecture())

y me dio

(64bit, 'ELF')
rekabbnad
fuente
¿El OP no describió esta solución como no funciona para él?
Antony Hatchkins
Eso puede ser, pero esto es EXACTAMENTE lo que necesitaba; perdón por hacer +1 una "respuesta incorrecta", pero lo necesitaba con urgencia.
UnsettlingTrend
Esta solución es perfecta para Solaris 11.
Steven Wolfe
11

platform.architecture() las notas dicen:

Nota: en Mac OS X (y quizás en otras plataformas), los archivos ejecutables pueden ser archivos universales que contienen múltiples arquitecturas.

Para llegar a la "64 bits" del intérprete actual, es más confiable consultar el atributo sys.maxsize:

import sys
is_64bits = sys.maxsize > 2**32
Shannon Mann
fuente
11

Agrupando todo ...

Teniendo en cuenta que:

  • La pregunta se hace para OSX (tengo una máquina virtual antigua (y agrietada) con una versión antigua de Python )
  • Mi principal env es Win
  • Solo tengo la versión de 32 bits instalada en Win (y construí una versión "paralizada" en Lnx )

Voy a ejemplificar en las 3 plataformas, usando Python 3 y Python 2 .

  1. Marque [Python 3.Docs]: sys. valor de tamaño máximo: compárelo con 0x100000000( 2 ** 32): mayor para 64 bits , menor para 32 bits :
    • OSX 9 x64 :
      • Python 2.7.10 x64 :
        >>> import sys
        >>> "Python {0:s} on {1:s}".format(sys.version, sys.platform)
        'Python 2.7.10 (default, Oct 14 2015, 05:51:29) \n[GCC 4.8.2] on darwin'
        >>> hex(sys.maxsize), sys.maxsize > 0x100000000
        ('0x7fffffffffffffff', True)
    • Ubuntu 16 x64 :
      • Python 3.5.2 x64 :
        >>> import sys
        >>> "Python {0:s} on {1:s}".format(sys.version, sys.platform)
        'Python 3.5.2 (default, Nov 23 2017, 16:37:01) \n[GCC 5.4.0 20160609] on linux'
        >>> hex(sys.maxsize), sys.maxsize > 0x100000000
        ('0x7fffffffffffffff', True)
      • Python 3.6.4 x86 :
        >>> import sys
        >>> "Python {0:s} on {1:s}".format(sys.version, sys.platform)
        'Python 3.6.4 (default, Apr 25 2018, 23:55:56) \n[GCC 5.4.0 20160609] on linux'
        >>> hex(sys.maxsize), sys.maxsize > 0x100000000
        ('0x7fffffff', False)
    • Gana 10 x64 :
      • Python 3.5.4 x64 :
        >>> import sys
        >>> "Python {0:s} on {1:s}".format(sys.version, sys.platform)
        'Python 3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32'
        >>> hex(sys.maxsize), sys.maxsize > 0x100000000
        ('0x7fffffffffffffff', True)
      • Python 3.6.2 x86 :
        >>> import sys
        >>> "Python {0:s} on {1:s}".format(sys.version, sys.platform)
        'Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:14:34) [MSC v.1900 32 bit (Intel)] on win32'
        >>> hex(sys.maxsize), sys.maxsize > 0x100000000
        ('0x7fffffff', False)


  1. Utilice [Python 3.Docs]: struct. calcsize ( formato ) para determinar el tamaño del objeto producido por el formato (puntero). En otras palabras, determina el tamaño del puntero (sizeof(void*) ):
    • OSX 9 x64 :
      • Python 2.7.10 x64 :
        >>> import struct
        >>> struct.calcsize("P") * 8
        64
    • Ubuntu 16 x64 :
      • Python 3.5.2 x64 :
        >>> import struct
        >>> struct.calcsize("P") * 8
        64
      • Python 3.6.4 x86 :
        >>> import struct
        >>> struct.calcsize("P") * 8
        32
    • Gana 10 x64 :
      • Python 3.5.4 x64 :
        >>> import struct
        >>> struct.calcsize("P") * 8
        64
      • Python 3.6.2 x86 :
        >>> import struct
        >>> struct.calcsize("P") * 8
        32


  1. Utilice [Python 3.Docs]: ctypes: una biblioteca de funciones foráneas para Python . También se reduce a determinar el tamaño de un puntero ( sizeof(void*)). Como nota, ctypes usa # 2. (no necesariamente para esta tarea) a través de "$ {PYTHON_SRC_DIR} / Lib / ctypes / __ init__.py" (alrededor de la línea # 15 ):
    • OSX 9 x64 :
      • Python 2.7.10 x64 :
        >>> import ctypes
        >>> ctypes.sizeof(ctypes.c_void_p) * 8
        64
    • Ubuntu 16 x64 :
      • Python 3.5.2 x64 :
        >>> import ctypes
        >>> ctypes.sizeof(ctypes.c_void_p) * 8
        64
      • Python 3.6.4 x86 :
        >>> import ctypes
        >>> ctypes.sizeof(ctypes.c_void_p) * 8
        32
    • Gana 10 x64 :
      • Python 3.5.4 x64 :
        >>> import ctypes
        >>> ctypes.sizeof(ctypes.c_void_p) * 8
        64
      • Python 3.6.2 x86 :
        >>> import ctypes
        >>> ctypes.sizeof(ctypes.c_void_p) * 8
        32


  1. [Python 3.Docs]: plataforma. arquitectura ( ejecutable = sys.executable, bits = '', enlace = '' ) !!! ¡NO es confiable en OSX ! debido al formato ejecutable de múltiples arcos (o .dylib ) (en algunos casos, usa el # 2 ):
    • OSX 9 x64 :
      • Python 2.7.10 x64 :
        >>> import platform
        >>> platform.architecture()
        ('64bit', '')
    • Ubuntu 16 x64 :
      • Python 3.5.2 x64 :
        >>> import platform
        >>> platform.architecture()
        ('64bit', 'ELF')
      • Python 3.6.4 x86 :
        >>> import platform
        >>> platform.architecture()
        ('32bit', 'ELF')
    • Gana 10 x64 :
      • Python 3.5.4 x64 :
        >>> import platform
        >>> platform.architecture()
        ('64bit', 'WindowsPE')
      • Python 3.6.2 x86 :
        >>> import platform
        >>> platform.architecture()
        ('32bit', 'WindowsPE')


  1. Solución poco convincente ( gainarie ): invoque un comando externo ( [man7]: FILE (1) ) a través de [Python 3.Docs]: os. sistema ( comando ) . Las limitaciones del # 4. aplicar (a veces puede que incluso no funcione):
    • OSX 9 x64 :
      • Python 2.7.10 x64 :
        >>> import os
        >>> os.system("file {0:s}".format(os.path.realpath(sys.executable)))
        /opt/OPSWbuildtools/2.0.6/bin/python2.7.global: Mach-O 64-bit executable x86_64
    • Ubuntu 16 x64 :
      • Python 3.5.2 x64 :
        >>> import os
        >>> os.system("file {0:s}".format(os.path.realpath(sys.executable)))
        /usr/bin/python3.5: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=59a8ef36ca241df24686952480966d7bc0d7c6ea, stripped
      • Python 3.6.4 x86 :
        >>> import os
        >>> os.system("file {0:s}".format(os.path.realpath(sys.executable)))
        /home/cfati/Work/Dev/Python-3.6.4/python: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=5c3d4eeadbd13cd91445d08f90722767b0747de2, not stripped
    • Gana 10 x64 :
      • la utilidad de archivo no está presente, hay otras herramientas de terceros que se pueden usar, pero no voy a insistir en ellas


Ganancia específica:

  1. Verifique los valores del entorno (por ejemplo, % PROCESSOR_ARCHITECTURE% (u otros)) a través de [Python 3.Docs]: os. medio ambiente :
    • Gana 10 x64 :
      • Python 3.5.4 x64 :
        >>> import os
        >>> os.environ["PROCESSOR_ARCHITECTURE"]
        'AMD64'
      • Python 3.6.2 x86 :
        >>> import os
        >>> os.environ["PROCESSOR_ARCHITECTURE"]
        'x86'


  1. [Python 3.Docs]: sys. versión (también se muestra en la primera línea al iniciar el intérprete)
    • Verifique # 1.
CristiFati
fuente
7

struct.calcsize("P")devuelve el tamaño de los bytes necesarios para almacenar un solo puntero. En un sistema de 32 bits, devolvería 4 bytes. En un sistema de 64 bits, devolvería 8 bytes.

Entonces, lo siguiente volvería 32si está ejecutando python de 32 bits y 64si está ejecutando python de 64 bits:

Python 2

import struct;print struct.calcsize("P") * 8

Python 3

import struct;print(struct.calcsize("P") * 8)
kimbaudi
fuente
5

Haz un python -VVen la línea de comando. Debería devolver la versión.

usuario12549815
fuente
Esto no muestra cómo hacerlo dentro de Python.
ParkerD
Esto no parece proporcionar la información necesaria para responder la pregunta
Dmitri Zaitsev
4
C:\Users\xyz>python

Python 2.7.6 (default, Nov XY ..., 19:24:24) **[MSC v.1500 64 bit (AMD64)] on win
32**
Type "help", "copyright", "credits" or "license" for more information.
>>>

después de tocar python en cmd

Nikhil
fuente
4
import sys
print(sys.version)

3.5.1 (v3.5.1: 37a07cee5969, 6 de diciembre de 2015, 01:54:25) [MSC v.1900 64 bit (AMD64) ]

betontalpfa
fuente
No se aplica a OSX .
CristiFati
2

Para 32 bits devolverá 32 y para 64 bits devolverá 64

import struct
print(struct.calcsize("P") * 8)
Byte Legion
fuente
1

La arquitectura de plataforma no es la forma confiable. En cambio nosotros:

$ arch -i386 /usr/local/bin/python2.7
Python 2.7.9 (v2.7.9:648dcafa7e5f, Dec 10 2014, 10:10:46)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import platform, sys
>>> platform.architecture(), sys.maxsize
(('64bit', ''), 2147483647)
>>> ^D
$ arch -x86_64 /usr/local/bin/python2.7
Python 2.7.9 (v2.7.9:648dcafa7e5f, Dec 10 2014, 10:10:46)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import platform, sys
>>> platform.architecture(), sys.maxsize
(('64bit', ''), 9223372036854775807)
Prakhar Agarwal
fuente
0

platform.architecture() Es problemático (y costoso).

Prueba convenientemente sys.maxsize > 2**32desde Py2.6.

Esta es una prueba fiable para la (predeterminado) Tamaño de puntero actual y compatible al menos desde Py2.3: struct.calcsize('P') == 8. También: ctypes.sizeof(ctypes.c_void_p) == 8.

Notas: Puede haber compilaciones con la opción gcc más -mx32o menos, que son aplicaciones de arquitectura de 64 bits, pero usan punteros de 32 bits de forma predeterminada (ahorro de memoria y velocidad). 'sys.maxsize = ssize_t' puede no representar estrictamente el tamaño del puntero C (generalmente de 2**31 - 1todos modos). Y hubo / hay sistemas que tienen diferentes tamaños de puntero para código y datos y es necesario aclarar cuál es exactamente el propósito de discernir el "modo de 32 bits o 64 bits".

kxr
fuente