Bagaimana cara menentukan apakah shell python saya mengeksekusi dalam mode 32bit atau 64bit pada OS X?

420

Saya perlu cara untuk mengetahui mode apa shell dari dalam shell.

Saya sudah mencoba melihat modul platform tetapi sepertinya hanya untuk memberi tahu Anda tentang "tentang arsitektur bit dan format tautan yang digunakan untuk dieksekusi": biner dikompilasi sebagai 64bit (saya menjalankan OS X 10.6) jadi sepertinya selalu melaporkan 64bit meskipun saya menggunakan metode yang dijelaskan di sini untuk memaksa mode 32bit).

jkp
sumber
1
Hanya karena ketertarikan: Mengapa Anda perlu tahu?
Lennart Regebro
2
Saya mengalami masalah dalam membangun dan memuat beberapa modul pada OS X 10.6. Khususnya pysco, yang mengeluh saya berjalan dalam mode 64bit. Ini adalah di bawah virtualenv juga sehingga ada beberapa komplikasi tambahan saya harus bekerja melalui ...
jkp
2
Saya ingin tahu karena ketika saya menggunakan sesuatu seperti PyInstaller untuk membuat distribusi biner yang berdiri sendiri (untuk diberikan kepada pengguna yang mungkin belum menginstal (versi yang tepat) Python, biner yang saya hasilkan akan 32/64 bit tergantung pada Python saya menjalankan PyInstaller dengan. Idealnya saya berpikir saya ingin secara otomatis nama file biner / arsip yang dihasilkan dengan '32' atau '64' dalam nama file, daripada harus secara manual mengubah nama file tergantung di mana saya jalankan perintah 'make' dari
Jonathan Hartley

Jawaban:

411

Salah satu caranya adalah dengan melihat sys.maxsizeseperti yang didokumentasikan di sini :

$ 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.maxsizediperkenalkan dalam Python 2.6. Jika Anda memerlukan tes untuk sistem yang lebih lama, tes yang sedikit lebih rumit ini akan bekerja pada semua rilis Python 2 dan 3:

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

BTW, Anda mungkin tergoda untuk menggunakannya platform.architecture(). Sayangnya, hasilnya tidak selalu dapat diandalkan, terutama dalam kasus OS X universal binari .

$ 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
sumber
14
Menggunakan sys.maxint tidak akan berfungsi untuk mendeteksi Python 64-bit saat menjalankan Windows (lihat di sini ). Sebagai gantinya, gunakan struct.calcsize ("P") untuk solusi lintas platform.
Luke Moore
Terima kasih sudah memeriksa. Saya sudah substansial direvisi jawabannya untuk menunjukkan sekarang didokumentasikan sys.maxsizetes untuk Python 2.6+ dan structuji yang digunakan oleh platformmodul yang juga bekerja untuk versi Python 2.
Ned Deily
Ini tidak berfungsi di IronPython, sys.maxsize adalah 2 ** 31 untuk 32 bit dan 64 bit IronPython
Meh
4
Yinon, itu benar tapi bukan itu yang ditanyakan. Dan, pada CPU di mana dimungkinkan untuk dijalankan, katakanlah, baik binari 32-bit atau 64-bit, lengkungan mesin biasanya tidak semua yang relevan dengan program Python; yang penting adalah apa yang dijalankan oleh interpreter Python itu sendiri.
Ned Deily
6
Pada windows cmd, Anda harus meletakkan tanda kutip ganda di luar dan tanda kutip tunggal di bagian dalam atau jika tidak maka akan menghasilkan kesalahan sintaksis. Itu mungkin karena windows berpikir ruang antara tanda kutip tunggal masih pembatas argumen. Mungkin bermanfaat untuk menyesuaikan jawaban ini untuk mengakomodasi fakta itu.
Steven Bluen
255

Saat memulai interpreter Python di terminal / baris perintah Anda juga dapat melihat baris seperti:

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

Di mana [MSC v.1500 64 bit (AMD64)]berarti Python 64-bit. Bekerja untuk pengaturan khusus saya.

Dustin
sumber
6
jadi ini apa? 64bit python atau 32bit python?
phpJs
9
@phpJs 64 bit karena[MSC v.1500 64 bit (AMD64)]
Eduard Florinescu
19
Sayangnya hanya berfungsi untuk Python versi Windows. Instalasi OSX saya kembaliPython 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
Di cygwin, Anda mendapatkan jawaban ini:Python 2.7.8 (default, Jul 25 2014, 14:04:36) [GCC 4.8.3] on cygwin
Jonno_FTW
1
Info ini dapat ditemukan dalam kode dengan menelepon sys.version. Saya mendapatkan misalnya ('3.4.4 |Continuum Analytics, Inc.| (default, Feb 16 2016, 09:54:04) [MSC ' 'v.1600 64 bit (AMD64)]')atau2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)]
otterb
191

Pada dasarnya varian jawaban Matthew Marshall (dengan struct dari std.library):

import struct
print struct.calcsize("P") * 8
ChristopheD
sumber
1
Imho, lebih baik daripada versi ctypes - bekerja bahkan dengan Python yang lebih lama.
yk4ever
7
Sangat bermanfaat, bisa digunakan dalam satu baris. struct impor $ python -c '; print struct.calcsize ("P") * 8 '
Sun Liwen
1
print (struct.calcsize ("P") * 8) lebih baik.
HelloWorld
2
jadi copy-paste oneliner untuk Python3:python -c "import struct; print(struct.calcsize('P')*8)"
Neinstein
78

Coba gunakan ctypes untuk mendapatkan ukuran dari void pointer:

import ctypes
print ctypes.sizeof(ctypes.c_voidp)

Ini akan menjadi 4 untuk 32 bit atau 8 untuk 64 bit.

Matthew Marshall
sumber
1
Itu juga berfungsi, meskipun ada sedikit kemungkinan kerugian dari impor dan modul yang tidak perlu jika Anda tidak memerlukan ctypes: modul sys, otoh, dikompilasi ke dalam interpreter.
Ned Deily
tolong bantu saya mengerti: pada instalasi 64b saya python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp)'mengembalikan 8 . Atau haruskah demikian python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp) * 8'?
lukmdo
Fungsi mengembalikan ukuran dalam byte (4 atau 8). Jika Anda membutuhkan ukuran dalam bit (32 atau 64) Anda harus mengalikannya dengan 8. b_is_python_64bit = (ctypes.sizeof (ctypes.c_voidp) == 8)
phobie
1
Panggil sajapython -c "import ctypes; print(32 if ctypes.sizeof(ctypes.c_voidp)==4 else 64, 'bit CPU')"
vitiral
55

Buka konsol python:

import platform
platform.architecture()[0]

itu harus menampilkan '64bit' atau '32bit' sesuai dengan platform Anda.

Atau ( dalam hal binari OS X ):

import sys
sys.maxsize > 2**32 
# it should display True in case of 64bit and False in case of 32bit
abe312
sumber
modul patform tidak selalu dapat diandalkan lihat dokumen docs.python.org/2/library/platform.html ini berlaku juga untuk beberapa aplikasi Windows
GM
18

Untuk solusi non-programatik, lihat di Monitor Aktivitas. Ini daftar arsitektur proses 64-bit sebagai "Intel (64-bit)".

Peter Hosey
sumber
1
Jawaban alternatif yang sangat bagus bagi kita yang menggunakan Mac OS 10.xx Terima kasih!
mkelley33
16

Pada sistem Centos Linux saya, saya melakukan yang berikut:

1) Memulai interpreter Python (Saya menggunakan 2.6.6)
2) Menjalankan kode berikut:

import platform
print(platform.architecture())

dan itu memberi saya

(64bit, 'ELF')
rekabbnad
sumber
Bukankah solusi ini digambarkan sebagai tidak berfungsi baginya oleh OP?
Antony Hatchkins
Itu mungkin, tetapi ini PERSIS apa yang saya butuhkan; maaf memberi +1 pada "jawaban yang salah", tetapi saya sangat membutuhkan ini.
UnsettlingTrend
Solusi ini sangat cocok untuk Solaris 11.
Steven Wolfe
11

platform.architecture() catatan mengatakan:

Catatan: Di Mac OS X (dan mungkin platform lain), file yang dapat dieksekusi mungkin file universal yang berisi banyak arsitektur.

Untuk mendapatkan "64-bitness" dari interpreter saat ini, lebih dapat diandalkan untuk menanyakan atribut sys.maxsize:

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

Mengelompokkan semuanya ...

Mengingat bahwa:

  • Pertanyaannya adalah bertanya untuk OSX (saya punya VM lama (dan retak) dengan versi Python kuno )
  • Env utama saya adalah Win
  • Saya hanya menginstal versi 32bit pada Win (dan saya membuat yang "lumpuh" di Lnx )

Saya akan mencontohkan pada semua 3 platform, menggunakan Python 3 dan Python 2 .

  1. Periksa [Python 3.Docs]: sys. nilai maksimum - bandingkan dengan 0x100000000( 2 ** 32): lebih besar untuk 64bit , lebih kecil untuk 32bit :
    • 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)
    • Menangkan 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. Gunakan [Python 3.Docs]: struct. calcsize ( format ) untuk menentukan ukuran objek yang dihasilkan oleh format (pointer). Dengan kata lain, tentukan ukuran pointer (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
    • Menangkan 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. Gunakan [Python 3.Docs]: ctypes - Pustaka fungsi asing untuk Python . Itu juga intinya untuk menentukan ukuran pointer ( sizeof(void*)). Sebagai catatan, ctypes menggunakan # 2. (tidak harus untuk tugas ini) melalui "$ {PYTHON_SRC_DIR} / Lib / ctypes / __ init__.py" (sekitar baris # 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
    • Menangkan 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]: platform. arsitektur ( executable = sys.executable, bits = '', linkage = '' ) !!! TIDAK dapat diandalkan di OSX !!! karena format multi arch executable (atau .dylib ) (dalam beberapa kasus, menggunakan # 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')
    • Menangkan 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. Solusi lumpuh ( gainarie ) - aktifkan perintah eksternal ( [man7]: FILE (1) ) melalui [Python 3.Docs]: os. sistem ( perintah ) . Keterbatasan # 4. berlaku (kadang-kadang bahkan mungkin tidak berhasil):
    • 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
    • Menangkan 10 x64 :
      • File utilitas tidak hadir, ada 3 lainnya rd alat Party yang dapat digunakan, tapi aku tidak akan bersikeras mereka


Menang spesifik:

  1. Periksa env vars (mis. % PROCESSOR_ARCHITECTURE% (atau lainnya)) melalui [Python 3.Docs]: os.lingkungan :
    • Menangkan 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 (juga ditampilkan pada tanggal 1 st garis ketika memulai penafsir)
    • Periksa # 1.
CristiFati
sumber
7

struct.calcsize("P")mengembalikan ukuran byte yang diperlukan untuk menyimpan satu pointer. Pada sistem 32-bit, itu akan mengembalikan 4 byte. Pada sistem 64-bit, itu akan mengembalikan 8 byte.

Jadi yang berikut ini akan kembali 32jika Anda menjalankan python 32-bit dan 64jika Anda menjalankan python 64-bit:

Python 2

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

Python 3

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

Lakukan python -VVdi baris perintah. Seharusnya mengembalikan versi.

pengguna12549815
sumber
Ini tidak menunjukkan cara melakukannya dalam Python.
ParkerD
Ini sepertinya tidak memberikan info yang diperlukan untuk menjawab pertanyaan
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.
>>>

setelah menekan python dalam cmd

Nikhil
sumber
4
import sys
print(sys.version)

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

antara horizontal
sumber
Tidak berlaku untuk OSX .
CristiFati
3

Berdasarkan jawaban abe32,

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

n_bits akan memiliki 32 atau 64 bit.

Rishabh Bhatnagar
sumber
2

Untuk 32 bit akan mengembalikan 32 dan untuk 64 bit akan mengembalikan 64

import struct
print(struct.calcsize("P") * 8)
legi byte
sumber
1

Arsitektur Platform bukan cara yang dapat diandalkan. Sebaliknya kami:

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

platform.architecture() bermasalah (dan mahal).

Mudah diuji sys.maxsize > 2**32sejak Py2.6.

Ini adalah tes yang dapat diandalkan untuk aktual (default) ukuran pointer dan kompatibel setidaknya sejak Py2.3: struct.calcsize('P') == 8. Juga: ctypes.sizeof(ctypes.c_void_p) == 8.

Catatan: Mungkin ada build dengan opsi gcc -mx32atau lebih, yang merupakan aplikasi arsitektur 64bit, tetapi gunakan pointer 32bit sebagai default (hemat memori dan kecepatan). 'sys.maxsize = ssize_t' mungkin tidak secara ketat mewakili ukuran pointer C (biasanya biasanya demikian 2**31 - 1). Dan ada sistem yang memiliki ukuran pointer berbeda untuk kode dan data dan perlu diklarifikasi apa sebenarnya tujuan membedakan "mode 32bit atau 64bit?"

kxr
sumber