Como determino se meu shell python está sendo executado no modo 32 bits ou 64 bits no OS X?

420

Eu preciso de uma maneira de dizer em que modo o shell está dentro do shell.

Eu tentei olhar para o módulo da plataforma , mas parece apenas falar sobre "sobre a arquitetura de bits e o formato de ligação usado para o executável": o binário é compilado como 64 bits (estou executando o OS X 10.6), portanto parece sempre relatar 64 bits, embora eu esteja usando os métodos descritos aqui para forçar o modo de 32 bits).

jkp
fonte
1
Apenas por interesse: Por que você precisa saber?
Lennart Regebro 10/09/09
2
Estou tendo problemas para criar e carregar alguns módulos no OS X 10.6. Especificamente pysco, que está reclamando que estou executando no modo de 64 bits. Esta é sob um virtualenv, bem assim, há algumas complicações extras que eu preciso para trabalhar com ...
jkp
2
Gostaria de saber porque, quando uso algo como PyInstaller para criar um binário distribuível autônomo (para dar aos usuários que talvez não tenham (a versão correta)) Python instalado, o binário que produzo será 32/64 bits, dependendo no Python, eu executo o PyInstaller. Idealmente, eu gostaria de nomear automaticamente o arquivo binário / archive resultante com '32' ou '64' no nome do arquivo, em vez de precisar renomear manualmente os arquivos, dependendo de onde eu executar o comando 'make' da.
Jonathan Hartley

Respostas:

411

Uma maneira é olhar sys.maxsizecomo documentado aqui :

$ 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.maxsizefoi introduzido no Python 2.6. Se você precisar de um teste para sistemas mais antigos, esse teste um pouco mais complicado deverá funcionar em todas as versões do Python 2 e 3:

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

BTW, você pode ser tentado a usar platform.architecture()para isso. Infelizmente, os resultados nem sempre são confiáveis, particularmente no caso de binários universais 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
fonte
14
O uso do sys.maxint não funcionará para detectar um Python de 64 bits ao executar o Windows (veja aqui ). Em vez disso, use struct.calcsize ("P") para uma solução de plataforma cruzada.
Luke Moore
Obrigado por verificar. Eu já revisto substancialmente a resposta para mostrar o agora documentado sys.maxsizeteste para Python 2.6+ eo structteste usado pelo platformmódulo que também funciona para versões mais antigas do Python 2.
Ned Deily
Isso não funciona em IronPython, sys.maxsize é 2 ** 31 para ambos 32 bits e 64 bits IronPython
Meh
4
Yinon, isso é verdade, mas não é isso que a pergunta faz. E, naquelas CPUs em que é possível executar, digamos, binários de 32 ou 64 bits, o arco da máquina geralmente não é tão relevante para um programa Python; o que importa é como o próprio interpretador de Python está sendo executado.
Ned Deily
6
No Windows cmd, é necessário colocar aspas duplas do lado de fora e aspas simples do lado de dentro, ou isso produzirá um erro de sintaxe. Provavelmente porque o Windows acha que os espaços entre aspas simples ainda são delimitadores de argumentos. Pode ser útil ajustar essa resposta para acomodar esse fato.
Steven Bluen
255

Ao iniciar o interpretador Python no terminal / linha de comando, você também pode ver uma linha como:

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

Onde [MSC v.1500 64 bit (AMD64)]significa Python de 64 bits. Funciona para minha configuração específica.

Dustin
fonte
6
então é isso que? Python de 64 bits ou python de 32 bits?
PhpJs
9
@phpJs 64 bits por causa de[MSC v.1500 64 bit (AMD64)]
Eduard Florinescu
19
Infelizmente, funciona apenas para versões do Python para Windows. Minha instalação do OSX retornaPython 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 13/08
6
No cygwin, você obtém esta resposta:Python 2.7.8 (default, Jul 25 2014, 14:04:36) [GCC 4.8.3] on cygwin
Jonno_FTW 10/11
1
Esta informação pode ser encontrada no código chamando sys.version. Eu recebo por exemplo ('3.4.4 |Continuum Analytics, Inc.| (default, Feb 16 2016, 09:54:04) [MSC ' 'v.1600 64 bit (AMD64)]')ou2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)]
otterb 31/03
191

Basicamente, uma variante da resposta de Matthew Marshall (com struct da biblioteca std.library):

import struct
print struct.calcsize("P") * 8
ChristopheD
fonte
1
Imho, melhor que a versão ctypes - funciona mesmo com o Python mais antigo.
Yk4ever
7
Muito útil, pode ser usado em uma linha. estrutura de importação $ python -c '; imprimir struct.calcsize ("P") * 8 '
Sun Liwen 23/04
1
print (struct.calcsize ("P") * 8) é melhor.
HelloWorld
2
então copiar e colar oneliner para Python3:python -c "import struct; print(struct.calcsize('P')*8)"
Neinstein
78

Tente usar ctypes para obter o tamanho de um ponteiro nulo:

import ctypes
print ctypes.sizeof(ctypes.c_voidp)

Serão 4 para 32 bits ou 8 para 64 bits.

Matthew Marshall
fonte
1
Isso também funciona, embora tenha a possível pequena desvantagem de uma importação e carregamento desnecessários de módulos, caso você não precise de ctypes: o módulo sys, otoh, é compilado no intérprete.
Ned Deily
por favor me ajude a entender: na minha instalação 64b python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp)'retorna 8 . Ou deveria ser python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp) * 8'?
Lukmdo
A função retorna o tamanho em bytes (4 ou 8). Se é necessário o tamanho em pedaços (32 ou 64) tem de multiplicar com 8. b_is_python_64bit = (ctypes.sizeof (ctypes.c_voidp) == 8)
Phobie
1
Apenas chamepython -c "import ctypes; print(32 if ctypes.sizeof(ctypes.c_voidp)==4 else 64, 'bit CPU')"
vitiral
55

Console python aberto:

import platform
platform.architecture()[0]

deve exibir '64 bits' ou '32 bits' de acordo com a sua plataforma.

Como alternativa ( no caso de binários do OS X ):

import sys
sys.maxsize > 2**32 
# it should display True in case of 64bit and False in case of 32bit
abe312
fonte
módulo patform nem sempre é docs de confiança vê docs.python.org/2/library/platform.html isso é verdade também para algum aplicativo do Windows
GM
18

Para uma solução não programática, procure no Monitor de Atividade. Ele lista a arquitetura dos processos de 64 bits como "Intel (64 bits)".

Peter Hosey
fonte
1
Uma resposta alternativa muito boa para aqueles que usam o Mac OS 10.xx Obrigado!
precisa saber é o seguinte
16

No meu sistema Centos Linux, fiz o seguinte:

1) Iniciei o interpretador Python (estou usando o 2.6.6)
2) Execute o seguinte código:

import platform
print(platform.architecture())

e isso me deu

(64bit, 'ELF')
rekabbnad
fonte
Essa solução não foi descrita como não útil para ele pelo OP?
Antony Hatchkins
Pode ser, mas é exatamente isso que eu precisava; desculpe marcar com +1 uma "resposta errada", mas eu precisava muito disso.
precisa saber é o seguinte
Esta solução é perfeita para Solaris 11.
Steven Wolfe
11

platform.architecture() as notas dizem:

Nota: No Mac OS X (e talvez em outras plataformas), os arquivos executáveis ​​podem ser arquivos universais que contêm várias arquiteturas.

Para obter o "64-bitness" do intérprete atual, é mais confiável consultar o atributo sys.maxsize:

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

Agrupando tudo ...

Considerando que:

  • A pergunta é feita para o OSX (eu tenho uma VM antiga (e quebrada) com uma versão antiga do Python )
  • Meu principal env é Win
  • Eu só tenho a versão de 32 bits instalada no Win (e criei uma versão "aleijada" no Lnx )

Vou exemplificar nas três plataformas, usando Python 3 e Python 2 .

  1. Marque [Python 3.Docs]: sys. valor maxsize - compare com 0x100000000( 2 ** 32): maior 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)
    • Ganhe 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. Use [Python 3.Docs]: struct. calcsize ( formato ) para determinar o tamanho do objeto produzido pelo formato (ponteiro). Em outras palavras, determina o tamanho do ponteiro ( 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
    • Ganhe 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. Use [Python 3.Docs]: ctypes - Uma biblioteca de funções estrangeira para Python . Também se resume a determinar o tamanho de um ponteiro ( sizeof(void*)). Como uma observação, ctypes usa # 2. (não necessariamente para esta tarefa) via "$ {PYTHON_SRC_DIR} / Lib / ctypes / __ init__.py" (na linha 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
    • Ganhe 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. arquitetura ( executável = sys.executable, bits = '', ligação = '' ) !!! NÃO é confiável no OSX !!! devido ao formato executável em arco múltiplo (ou .dylib ) (em alguns casos, usa # 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')
    • Ganhe 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. Solução alternativa aleijada ( ganho ) - invoque um comando externo ( [man7]: FILE (1) ) via [Python 3.Docs]: os. sistema ( comando ) . As limitações do # 4.aplicar (às vezes pode até não funcionar):
    • 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
    • Ganhe 10 x64 :
      • utilitário de arquivo não está presente, existem outras ferramentas de terceiros que podem ser usadas, mas não vou insistir nelas


Vitória específica:

  1. Verifique os envios (por exemplo, % PROCESSOR_ARCHITECTURE% (ou outros)) via [Python 3.Docs]: os. meio ambiente :
    • Ganhe 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. versão (também apresentada na 1 r linha quando se inicia o intérprete)
    • Marque # 1.
CristiFati
fonte
7

struct.calcsize("P")retorna o tamanho dos bytes necessários para armazenar um único ponteiro. Em um sistema de 32 bits, ele retornaria 4 bytes. Em um sistema de 64 bits, ele retornaria 8 bytes.

Portanto, o seguinte retornaria 32se você estiver executando o python de 32 bits e 64se estiver executando o python de 64 bits:

Python 2

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

Python 3

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

Faça um python -VVna linha de comando. Deve retornar a versão.

user12549815
fonte
Isso não mostra como fazê-lo no Python.
ParkerD 17/12/19
Isso parece não fornecer as informações necessárias para responder à pergunta
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.
>>>

depois de bater python no cmd

Nikhil
fonte
4
import sys
print(sys.version)

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

betontalpfa
fonte
Não se aplica ao OSX .
CristiFati 25/09
3

Com base na resposta de abe32,

import sys
n_bits = 32 << bool(sys.maxsize >> 32)

Os n_bits terão 32 ou 64 bits.

Rishabh Bhatnagar
fonte
2

Para 32 bits retornará 32 e para 64 bits retornará 64

import struct
print(struct.calcsize("P") * 8)
byte legião
fonte
1

Arquitetura de plataforma não é a maneira confiável. Em vez disso nós:

$ 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
fonte
0

platform.architecture() é problemático (e caro).

Teste convenientemente sys.maxsize > 2**32desde o Py2.6.

Este é um teste fiável para o (padrão) tamanho real ponteiro e compatível, pelo menos, uma vez que Py2.3: struct.calcsize('P') == 8. Também: ctypes.sizeof(ctypes.c_void_p) == 8.

Notas: Pode haver compilações com a opção gcc -mx32ou mais, que são aplicativos de arquitetura de 64 bits, mas usam ponteiros de 32 bits como padrão (economizando memória e velocidade). 'sys.maxsize = ssize_t' pode não representar estritamente o tamanho do ponteiro C (geralmente é 2**31 - 1assim mesmo). E havia / existem sistemas que têm tamanhos de ponteiro diferentes para código e dados e precisa ser esclarecido qual é exatamente o objetivo de discernir o "modo 32 bits ou 64 bits"?

kxr
fonte