Làm cách nào để xác định xem shell python của tôi đang thực thi ở chế độ 32 bit hay 64 bit trên OS X?


420

Tôi cần một cách để biết vỏ ở chế độ nào trong vỏ.

Tôi đã thử nhìn vào mô-đun nền tảng nhưng dường như chỉ cho bạn biết về "kiến trúc bit và định dạng liên kết được sử dụng để thực thi": nhị phân được biên dịch thành 64 bit mặc dù (tôi đang chạy trên OS X 10.6) dường như luôn báo cáo 64 bit mặc dù tôi đang sử dụng các phương pháp được mô tả ở đây để buộc chế độ 32 bit).


1
Chỉ cần quan tâm: Tại sao bạn cần biết?
Lennart Regebro

2
Tôi đang gặp sự cố khi xây dựng và tải một số mô-đun trên OS X 10.6. Cụ thể là pysco, đang phàn nàn rằng tôi đang chạy ở chế độ 64 bit. Đây cũng là một virtualenv vì vậy có một số biến chứng thêm mà tôi cần phải xử lý ...
jkp

2
Tôi muốn biết vì khi tôi sử dụng thứ gì đó như PyInstaller để tạo phân phối nhị phân độc lập (để cung cấp cho người dùng không cài đặt (phiên bản đúng) Python, tệp nhị phân tôi sản xuất sẽ tùy thuộc vào 32/64 bit trên Python tôi chạy PyInstaller với. Lý tưởng nhất là tôi nghĩ tôi muốn tự động đặt tên tệp nhị phân / lưu trữ kết quả với '32' hoặc '64' trong tên tệp, thay vì phải đổi tên thủ công các tệp tùy thuộc vào nơi tôi thực hiện lệnh 'make' từ.
Jonathan Hartley

Câu trả lời:


411

Một cách là nhìn vào sys.maxsize như tài liệu ở đây :

$ 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.maxsizeđã được giới thiệu trong Python 2.6. Nếu bạn cần thử nghiệm cho các hệ thống cũ hơn, thử nghiệm phức tạp hơn một chút này sẽ hoạt động trên tất cả các bản phát hành Python 2 và 3:

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

BTW, bạn có thể bị cám dỗ để sử dụng platform.architecture()cho việc này. Thật không may, kết quả của nó không phải lúc nào đáng tin cậy, đặc biệt là trong trường hợp của OS X nhị phân phổ quát .

$ 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
Sử dụng sys.maxint sẽ không hoạt động để phát hiện Python 64 bit khi chạy Windows (xem tại đây ). Thay vào đó, sử dụng struct.calcsize ("P") cho giải pháp đa nền tảng.
Luke Moore

Cảm ơn vì đã kiểm tra. Tôi đã sửa đổi đáng kể câu trả lời để hiển thị sys.maxsizethử nghiệm đã được ghi lại cho Python 2.6+ và structthử nghiệm được sử dụng bởi platformmô-đun cũng hoạt động cho các phiên bản cũ hơn của Python 2.
Ned Deily

Điều này không hoạt động trong IronPython, sys.maxsize là 2 ** 31 cho cả IronPython 32 bit và 64 bit
Meh

4
Yinon, điều đó đúng nhưng đó không phải là câu hỏi yêu cầu. Và, trên các CPU có thể chạy được, giả sử, nhị phân 32 bit hoặc 64 bit, vòm của máy thường không liên quan đến chương trình Python; Vấn đề là bản thân trình thông dịch Python đang chạy như thế nào.
Ned Deily

6
Trên windows cmd, bạn cần đặt dấu ngoặc kép ở bên ngoài và dấu ngoặc đơn ở bên trong nếu không nó sẽ tạo ra lỗi cú pháp. Điều đó có thể là do các cửa sổ nghĩ rằng khoảng trắng giữa các dấu ngoặc đơn vẫn là các dấu phân cách đối số. Nó có thể hữu ích để điều chỉnh câu trả lời này để phù hợp với thực tế đó.
Steven Bluen

255

Khi khởi động trình thông dịch Python trong dòng thiết bị đầu cuối / lệnh, bạn cũng có thể thấy một dòng như:

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

Trong đó [MSC v.1500 64 bit (AMD64)]có nghĩa là Python 64-bit. Hoạt động cho thiết lập cụ thể của tôi.


6
vậy đây là cái gì Con trăn 64 bit hay con trăn 32 bit?
phpJs

9
@phpJs 64 bit vì[MSC v.1500 64 bit (AMD64)]
Eduard Florinescu

19
Thật không may, chỉ hoạt động cho các phiên bản Windows của Python. Cài đặt OSX của tôi trở lạiPython 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
Trên cygwin, bạn nhận được câu trả lời này:Python 2.7.8 (default, Jul 25 2014, 14:04:36) [GCC 4.8.3] on cygwin
Jonno_FTW

1
Thông tin này có thể được tìm thấy trong mã bằng cách gọi sys.version. Tôi lấy ví dụ ('3.4.4 |Continuum Analytics, Inc.| (default, Feb 16 2016, 09:54:04) [MSC ' 'v.1600 64 bit (AMD64)]')hoặc2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)]
otterb

191

Về cơ bản là một biến thể của câu trả lời của Matthew Marshall (với cấu trúc từ std.l Library):

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

1
Imho, tốt hơn phiên bản ctypes - hoạt động ngay cả với Python cũ.
yk4ever

7
Rất hữu ích, có thể được sử dụng trong một dòng. $ python -c 'nhập cấu trúc; in struct.calcsize ("P") * 8 '
Sun Liwen

1
in (struct.calcsize ("P") * 8) là tốt hơn.
HelloWorld

2
vì vậy, sao chép-dán oneliner cho Python3:python -c "import struct; print(struct.calcsize('P')*8)"
Neinstein

78

Hãy thử sử dụng ctypes để lấy kích thước của một con trỏ void:

import ctypes
print ctypes.sizeof(ctypes.c_voidp)

Nó sẽ là 4 cho 32 bit hoặc 8 cho 64 bit.


1
Điều đó cũng hoạt động, mặc dù nó có nhược điểm nhỏ có thể xảy ra khi nhập và tải mô-đun không cần thiết nếu bạn không cần ctypes: mô-đun sys, otoh, được biên dịch vào trình thông dịch.
Ned Deily

xin vui lòng giúp tôi hiểu: trên cài đặt 64b của tôi python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp)'trả về 8 . Hay là nó nên python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp) * 8'?
lukmdo

Hàm trả về kích thước theo byte (4 hoặc 8). Nếu bạn cần kích thước theo bit (32 hoặc 64), bạn phải nhân với 8. b_is_python_64bit = (ctypes.sizeof (ctypes.c_voidp) == 8)
phobie

1
Chỉ cần gọipython -c "import ctypes; print(32 if ctypes.sizeof(ctypes.c_voidp)==4 else 64, 'bit CPU')"
vitirus

55

Mở bảng điều khiển python:

import platform
platform.architecture()[0]

nó sẽ hiển thị '64 bit' hoặc '32 bit' theo nền tảng của bạn.

Ngoài ra ( trong trường hợp nhị phân OS X ):

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

mô-đun patform không phải luôn luôn tài liệu đáng tin cậy see docs.python.org/2/library/platform.html điều này là đúng còn đối với một số ứng dụng Windows
GM

18

Đối với một giải pháp phi lập trình, hãy xem trong Trình giám sát hoạt động. Nó liệt kê kiến ​​trúc của các quy trình 64 bit như là Intel Intel (64 bit).


1
Một câu trả lời thay thế rất hay cho những người trong chúng ta sử dụng Mac OS 10.xx Cảm ơn bạn!
mkelley33

16

Trên hệ thống Centos Linux của tôi, tôi đã làm như sau:

1) Bắt đầu trình thông dịch Python (Tôi đang sử dụng 2.6.6)
2) Chạy mã sau:

import platform
print(platform.architecture())

và nó đã cho tôi

(64bit, 'ELF')

Không phải giải pháp này được mô tả là không làm việc cho anh ta bởi OP sao?
Antony Hatchkins

Đó có thể là, nhưng đây là chính xác những gì tôi cần; xin lỗi để +1 "câu trả lời sai", nhưng tôi rất cần điều này.
Bất ổn Xu hướng

Giải pháp này hoàn hảo cho Solaris 11.
Steven Wolfe

11

platform.architecture() ghi chú nói:

Lưu ý: Trên Mac OS X (và có lẽ các nền tảng khác), các tệp thực thi có thể là các tệp phổ quát chứa nhiều kiến ​​trúc.

Để có được tại phiên bản 64 bit bit của người phiên dịch hiện tại, việc truy vấn thuộc tính sys.maxsize là đáng tin cậy hơn:

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

11

Phân nhóm mọi thứ ...

Xem xét rằng:

  • Câu hỏi được đặt ra cho OSX (Tôi có một máy ảo cũ (và đã bị bẻ khóa) với phiên bản Python cổ )
  • Env chính của tôi là Win
  • Tôi chỉ cài đặt phiên bản 32 bit trên Win (và tôi đã xây dựng một phiên bản "què quặt" trên Lnx )

Tôi sẽ làm gương trên cả 3 nền tảng, sử dụng Python 3Python 2 .

  1. Kiểm tra [Python 3.Docs]: sys. maxsize giá trị - so sánh nó với 0x100000000( 2 ** 32): lớn cho 64bit , nhỏ hơn cho 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)
    • Kiếm được 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. Sử dụng [Python 3.Docs]: struct. calcsize ( định dạng ) để xác định kích thước đối tượng được tạo bởi định dạng (con trỏ). Nói cách khác, xác định kích thước con trỏ ( 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
    • Kiếm được 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. Sử dụng [Python 3.Docs]: ctypes - Thư viện hàm ngoại cho Python . Nó cũng sôi sục để xác định kích thước của một con trỏ ( sizeof(void*)). Lưu ý, ctypes sử dụng # 2. (không nhất thiết phải thực hiện nhiệm vụ này) thông qua "$ {PYTHON_SRC_DIR} / Lib / ctypes / __ init__.py" (khoảng dòng 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
    • Kiếm được 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]: nền tảng. kiến trúc ( thực thi = sys.executable, bits = '', linkage = '' ) !!! KHÔNG đáng tin cậy trên OSX !!! do định dạng đa vòm thực thi (hoặc .dylib ) (trong một số trường hợp, sử dụng # 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')
    • Kiếm được 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. Lame workaround ( gainarie ) - gọi một lệnh bên ngoài ( [man7]: FILE (1) ) thông qua [Python 3.Docs]: os. hệ thống ( lệnh ) . Những hạn chế của # 4. áp dụng (đôi khi nó có thể không hoạt động):
    • 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
    • Kiếm được 10 x64 :
      • tiện ích tệp không có, có các công cụ của bên thứ 3 khác có thể được sử dụng, nhưng tôi sẽ không nhấn mạnh vào chúng


Thắng cụ thể:

  1. Kiểm tra vars env (ví dụ % PROCESSOR_ARCHITECTURE% (hoặc những người khác)) qua [Python 3.Docs]: os. môi trường :
    • Kiếm được 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]: hệ thống. phiên bản (cũng được hiển thị ở dòng thứ 1 khi bắt đầu trình thông dịch)
    • Kiểm tra số 1.

7

struct.calcsize("P")trả về kích thước của các byte cần thiết để lưu trữ một con trỏ. Trên hệ thống 32 bit, nó sẽ trả về 4 byte. Trên hệ thống 64 bit, nó sẽ trả về 8 byte.

Vì vậy, những điều sau đây sẽ trở lại 32nếu bạn đang chạy python 32 bit và 64nếu bạn đang chạy python 64 bit:

Con trăn 2

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

Con trăn 3

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

5

Làm một python -VVtrong dòng lệnh. Nó sẽ trả về phiên bản.


Đây không phải là cách hiển thị trong Python.
ParkerD

Điều này dường như không cung cấp thông tin cần thiết để trả lời câu hỏi
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.
>>>

sau khi đánh con trăn trong cmd


4
import sys
print(sys.version)

3.5.1 (v3.5.1: 37a07cee5969, ngày 6 tháng 12 năm 2015, 01:54:25) [MSC v.1900 64 bit (AMD64) ]


Không áp dụng cho OSX .
CristiFati


2

Trong 32 bit, nó sẽ trả về 32 và trong 64 bit, nó sẽ trả về 64

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

1

Kiến trúc nền tảng không phải là cách đáng tin cậy. Thay vào đó chúng tôi:

$ 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() là vấn đề (và đắt tiền).

Kiểm tra thuận tiện sys.maxsize > 2**32kể từ Py2.6.

Đây là một thử nghiệm đáng tin cậy cho kích thước con trỏ (mặc định) thực tế và tương thích ít nhất kể từ Py2.3 : struct.calcsize('P') == 8. Ngoài ra : ctypes.sizeof(ctypes.c_void_p) == 8.

Lưu ý: Có thể có các bản dựng với tùy chọn gcc -mx32hoặc hơn, đó là các ứng dụng kiến ​​trúc 64 bit, nhưng sử dụng con trỏ 32 bit làm mặc định (tiết kiệm bộ nhớ và tốc độ). 'Sys.maxsize = ssize_t' có thể không thể hiện đúng kích thước con trỏ C ( 2**31 - 1dù sao nó cũng thường ). Và đã có / là các hệ thống có kích thước con trỏ khác nhau cho mã và dữ liệu và nó cần được làm rõ chính xác mục đích của "chế độ 32 bit hay 64 bit" là gì?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.