Python kabuğumun OS X'de 32bit mi yoksa 64bit modunda mı çalıştığını nasıl belirleyebilirim?


420

Kabuğun içinde hangi modda olduğunu söyleyecek bir yola ihtiyacım var.

Platform modülüne bakmayı denedim ama sadece "bit mimarisi ve yürütülebilir dosya için kullanılan bağlantı biçimi hakkında" hakkında bilgi vermek gibi görünüyor: ikili olsa 64bit olarak derlenmiş (OS X 10.6 üzerinde çalışıyorum) 32bit modunu zorlamak için burada açıklanan yöntemleri kullandığım halde her zaman 64bit bildiriyor gibi görünüyor ).


1
Sadece ilgisiz: Neden bilmeniz gerekiyor?
Lennart Regebro

2
OS X 10.6'da bazı modülleri oluşturma ve yükleme konusunda sorun yaşıyorum. Özellikle 64 bit modunda çalıştığımdan şikayet eden pysco. Bu da bir sanalenv altındadır, bu yüzden çalışmam gereken bazı ekstra komplikasyonlar var ...
jkp

2
Bilmek istiyorum çünkü tek başına bir ikili dağıtılabilir oluşturmak için PyInstaller gibi bir şey kullandığımda (Python yüklü olmayan (doğru sürümü) kullanıcılara vermek için, ürettiğim ikili 32/64 bit olacak İdeal olarak, dosyaları otomatik olarak yeniden adlandırmak yerine dosya adında '32' veya '64' ile oluşan ikili / arşiv dosyasını otomatik olarak adlandırmak istediğimi düşünüyorum. 'make' komutunu çalıştırın.
Jonathan Hartley

Yanıtlar:


411

Bunun bir yolu, buradasys.maxsize belgelendiği gibi bakmaktır :

$ 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.maxsizePython 2.6'da tanıtıldı. Eski sistemler için bir teste ihtiyacınız varsa, bu biraz daha karmaşık test tüm Python 2 ve 3 sürümlerinde çalışmalıdır:

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

BTW, bunun için kullanmaya cazip olabilirsiniz platform.architecture(). Ne yazık ki, sonuçları özellikle OS X evrensel ikili dosyaları için her zaman güvenilir değildir .

$ 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

14
Windows çalışırken sys.maxint kullanmak bir 64 bit Python algılamak için çalışmaz ( buraya bakın ). Bunun yerine, platformlar arası bir çözüm için struct.calcsize ("P") kullanın.
Luke Moore

Kontrol ettiğin için teşekkürler. sys.maxsizePython 2.6+ için şimdi belgelenmiş testi ve Python 2'nin eski sürümleri için de çalışan modül structtarafından kullanılan testi göstermek için cevabı büyük ölçüde gözden platform
geçirdim

Bu IronPython'da çalışmaz, sys.maxsize hem 32 bit hem de 64 bit için 2 ** 31'dir IronPython
Meh

4
Yinon, bu doğru ama sorunun sorması bu değil. Ve, örneğin 32 bit veya 64 bit ikili dosyaları çalıştırmanın mümkün olduğu CPU'larda, makinenin kemeri genellikle bir Python programı ile ilgili değildir; önemli olan Python yorumlayıcısının kendisinin hangi kemer olarak çalıştığıdır.
Ned Deily

6
Windows cmd'de, çift tırnakları dışa ve tek tırnakları iç tarafa koymanız gerekir, aksi takdirde bir sözdizimi hatası üretecektir. Muhtemelen pencereler tek tırnaklar arasındaki boşlukların hala argüman sınırlayıcıları olduğunu düşünüyor. Bu cevabı bu gerçeğe uyacak şekilde ayarlamak yararlı olabilir.
Steven Bluen

255

Terminal / komut satırında Python yorumlayıcısını başlatırken aşağıdaki gibi bir satır da görebilirsiniz:

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

Burada [MSC v.1500 64 bit (AMD64)]64 bit Python anlamına gelir. Benim özel kurulum için çalışır.


6
yani bu ne? 64bit python veya 32bit python?
phpJs

9
@phpJs 64 bit yüzünden[MSC v.1500 64 bit (AMD64)]
Eduard Florinescu

19
Ne yazık ki sadece Python'un Windows sürümleri için çalışıyor. OSX kurulumum geri dönüyorPython 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

6
Python 2.7.8 (default, Jul 25 2014, 14:04:36) [GCC 4.8.3] on cygwin
Cygwin'de

1
Bu bilgi kodla arayarak bulunabilir sys.version. Ben mesela olsun ('3.4.4 |Continuum Analytics, Inc.| (default, Feb 16 2016, 09:54:04) [MSC ' 'v.1600 64 bit (AMD64)]')veya2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)]
otterb

191

Temel olarak Matthew Marshall'ın cevabında bir varyant (std.library'nin yapısı ile):

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

1
Imho, ctypes versiyonundan daha iyi - eski Python ile bile çalışır.
yk4ever

7
Çok kullanışlı, bir satırda kullanılabilir. $ python -c 'içe aktarma yapısı; print struct.calcsize ("P") * 8 '
Sun Liwen

1
print (struct.calcsize ("P") * 8) daha iyidir.
HelloWorld

2
Python3 için kopyalayıp yapıştırın oneliner:python -c "import struct; print(struct.calcsize('P')*8)"
Neinstein

78

Geçersiz bir işaretçinin boyutunu elde etmek için ctypes kullanmayı deneyin:

import ctypes
print ctypes.sizeof(ctypes.c_voidp)

32 bit için 4 veya 64 bit için 8 olacaktır.


1
Bu da işe yarıyor, aksi halde ctypes'e ihtiyacınız yoksa gereksiz bir ithalat ve modül yükünün hafif bir dezavantajına sahip olsa da: sys modülü, otoh yorumlayıcıda derlenir.
Ned Deily

lütfen anlamama yardım et: 64b kurulumumda 8python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp)' döndürür . Yoksa öyle mi? python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp) * 8'
lukmdo

İşlev boyutu bayt (4 veya 8) olarak döndürür . Bit cinsinden boyuta ihtiyacınız varsa (32 veya 64) 8 ile çarpmanız gerekir. B_is_python_64bit = (ctypes.sizeof (ctypes.c_voidp) == 8)
phobie

1
Just callpython -c "import ctypes; print(32 if ctypes.sizeof(ctypes.c_voidp)==4 else 64, 'bit CPU')"
vitiral

55

Python konsolunu aç:

import platform
platform.architecture()[0]

platformunuza göre '64bit' veya '32bit' görüntülemelidir.

Alternatif olarak ( OS X ikili dosyalarında ):

import sys
sys.maxsize > 2**32 
# it should display True in case of 64bit and False in case of 32bit

patform modülü her zaman güvenilir bkz dokümanlar değildir docs.python.org/2/library/platform.html bu bazı Windows uygulaması için de geçerlidir
GM

18

Programlı olmayan bir çözüm için Etkinlik Monitörü'ne bakın. 64 bit işlemlerin mimarisini “Intel (64 bit)” olarak listeler.


1
Mac OS 10.xx kullananlarımız için çok güzel bir alternatif cevap Teşekkürler!
mkelley33

16

Centos Linux sistemimde aşağıdakileri yaptım:

1) Python yorumlayıcısını başlattım (2.6.6 kullanıyorum)
2) Aşağıdaki kodu çalıştırdım:

import platform
print(platform.architecture())

ve bana verdi

(64bit, 'ELF')

Bu çözüm OP tarafından onun için işe yaramıyor muydu?
Antony Hatchkins

Bu olabilir, ama tam olarak ihtiyacım olan şey bu; "yanlış cevabı" + 1'lediğim için üzgünüm, ama buna çok ihtiyacım vardı.
UnsettlingTrend

Bu çözüm Solaris 11 için mükemmeldir
Steven Wolfe

11

platform.architecture() notlar diyor ki:

Not: Mac OS X'te (ve belki de diğer platformlarda), yürütülebilir dosyalar birden fazla mimari içeren evrensel dosyalar olabilir.

Mevcut yorumlayıcının “64 bitliğine” ulaşmak için, sys.maxsize özniteliğini sorgulamak daha güvenilirdir:

import sys
is_64bits = sys.maxsize > 2**32

11

Her şey gruplanıyor ...

Hesaba katıldığında:

  • Soru OSX için soruluyor ( Eski bir Python sürümüne sahip eski (ve çatlamış) bir VM'im var )
  • Benim envim Win
  • Sadece 32bit sürümü Win üzerinde yüklü (ve ben Lnx üzerinde bir "sakat" bir tane inşa )

Python 3 ve Python 2'yi kullanarak 3 platformda da örnek vereceğim .

  1. [Python 3.Docs] öğesini kontrol edin : sys. maxsize değeri - ile karşılaştır 0x100000000( 2 ** 32): 64bit için daha büyük , 32bit için daha küçük :
    • 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)
    • 10 x64 kazanın :
      • 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. [Python 3.Docs]: struct kullanın . (işaretçi) biçimi tarafından üretilen nesne boyutunu belirlemek için kalssize ( format ) . Başka bir deyişle, işaretçi boyutunu ( sizeof(void*)) belirler:
    • 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
    • 10 x64 kazanın :
      • 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. [Python 3.Docs] kullanın : ctypes - Python için yabancı işlev kütüphanesi . Ayrıca bir işaretçinin ( sizeof(void*)) boyutunu belirlemek için de kaynar . Not olarak, ctypes # 2 kullanır . (bu görev için gerekli değildir) "$ {PYTHON_SRC_DIR} / Lib / ctypes / __ init__.py" aracılığıyla ( satır # 15 civarında ):
    • 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
    • 10 x64 kazanın :
      • 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]: platform. mimari ( yürütülebilir = sys.executable, bits = '', linkage = '' ) !!! OSX'te güvenilir DEĞİL !!! çoklu kemer yürütülebilir (veya .dylib ) biçimi nedeniyle (bazı durumlarda # 2 kullanır ):
    • 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')
    • 10 x64 kazanın :
      • Python 3.5.4 x64 :
        >>> import platform
        >>> platform.architecture()
        ('64bit', 'WindowsPE')
      • Python 3.6.2 x86 :
        >>> import platform
        >>> platform.architecture()
        ('32bit', 'WindowsPE')


  1. Lame geçici çözümü ( gainarie ) - [Python 3.Docs]: os aracılığıyla harici bir komut ( [man7]: FILE (1) ) çağırın. sistemi ( komut ) . 4 numaralı sınırlamalar . uygulayın (bazen işe yaramayabilir):
    • 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
    • 10 x64 kazanın :
      • dosya yardımcı programı mevcut değil, kullanılabilecek diğer 3. Taraf araçları var, ancak bunlarda ısrar etmeyeceğim


Özel kazan :

  1. [Python 3.Docs]: os aracılığıyla env değişkenlerini kontrol edin (örn. % PROCESSOR_ARCHITECTURE% (veya diğerleri)) . environ :
    • 10 x64 kazanın :
      • 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. versiyonu (ayrıca 1 görüntülenen st hattı tercüman başlatırken)
    • Kontrol # 1.

7

struct.calcsize("P")tek bir işaretçiyi saklamak için gereken bayt boyutunu döndürür. 32 bit sistemde 4 bayt dönecektir. 64 bit sistemde 8 bayt döndürür.

3232 bit python kullanıyorsanız ve 6464 bit python kullanıyorsanız aşağıdakiler geri dönecektir :

Python 2

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

Python 3

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

5

Bir Do python -VVkomut satırında. Sürümü döndürmelidir.


Bu Python içinde nasıl yapılacağını göstermiyor.
ParkerD

Bu soruya cevap vermek için gerekli bilgileri sağlamıyor gibi görünüyor
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.
>>>

cmd python vurduktan sonra


4
import sys
print(sys.version)

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


OSX için geçerli değildir .
CristiFati


2

32 bit için 32, 64 bit için 64 bit

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

1

Platform Mimarisi güvenilir bir yol değildir. Bunun yerine:

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

0

platform.architecture() sorunlu (ve pahalı).

sys.maxsize > 2**32Py2.6'dan beri rahatça test edin.

Bu, en az Py2.3 yana güvenilir gerçek (varsayılan) ibre boyutu için deney ve uyumludur: struct.calcsize('P') == 8. Ayrıca: ctypes.sizeof(ctypes.c_void_p) == 8.

Notlar: -mx3264bit mimari uygulamaları olan gcc seçeneğiyle derlemeler olabilir , ancak varsayılan olarak 32bit işaretçiler kullanır (bellek ve hız tasarrufu). 'sys.maxsize = ssize_t' kesinlikle C işaretçisi boyutunu temsil etmeyebilir (genellikle 2**31 - 1her neyse). Ve kod ve veriler için farklı işaretçi boyutlarına sahip sistemler mevcuttu / var ve bunların "32bit veya 64bit modu" nu tam olarak anlamasının ne olduğu açıklığa kavuşturulmalı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.