ฉันจะทราบได้อย่างไรว่าไพ ธ อนเชลล์ทำงานในโหมด 32 บิตหรือ 64 บิตบน OS X หรือไม่?


420

ฉันต้องการวิธีที่จะบอกโหมดที่เชลล์ใช้จากภายในเชลล์

ฉันได้ลองดูที่โมดูลแพลตฟอร์มแต่ดูเหมือนจะบอกคุณเกี่ยวกับ "เกี่ยวกับสถาปัตยกรรมบิตและรูปแบบการเชื่อมโยงที่ใช้สำหรับปฏิบัติการ": ไบนารีจะถูกคอมไพล์เป็น 64 บิตแม้ว่า (ฉันใช้งานบน OS X 10.6) ดูเหมือนว่าจะรายงาน 64 บิตเสมอแม้ว่าฉันใช้วิธีที่อธิบายไว้ที่นี่เพื่อบังคับโหมด 32 บิต)


1
ไม่สนใจ: ทำไมคุณต้องรู้
Lennart Regebro

2
ฉันมีปัญหาในการสร้างและโหลดโมดูลบางอย่างใน OS X 10.6 pysco เฉพาะซึ่งบ่นฉันกำลังทำงานในโหมด 64 บิต นี้อยู่ภายใต้ virtualenv เช่นกันเพื่อให้มีบางภาวะแทรกซ้อนพิเศษฉันต้องทำงานผ่าน ...
JKP

2
ฉันอยากจะรู้เพราะเมื่อฉันใช้บางอย่างเช่น PyInstaller เพื่อสร้างไบนารีแบบสแตนด์อโลนที่แจกจ่ายได้ (เพื่อมอบให้กับผู้ใช้ที่อาจไม่มี (เวอร์ชั่นที่เหมาะสม) ติดตั้ง Python ไบนารีที่ฉันสร้างขึ้นจะขึ้นอยู่กับ 32/64 บิต ใน Python ที่ฉันเรียกใช้ PyInstaller ด้วยฉันนึกว่าฉันต้องการตั้งชื่อไฟล์ไบนารี / ไฟล์เก็บถาวรที่เป็นผลลัพธ์โดยอัตโนมัติด้วย '32' หรือ '64' ในชื่อไฟล์แทนที่จะต้องเปลี่ยนชื่อไฟล์ด้วยตนเองตามตำแหน่งที่ฉัน รันคำสั่ง 'make' จาก
Jonathan Hartley

คำตอบ:


411

วิธีหนึ่งคือดูsys.maxsizeเอกสารที่นี่ :

$ 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เปิดตัวใน Python 2.6 หากคุณต้องการการทดสอบสำหรับระบบรุ่นเก่าการทดสอบที่ซับซ้อนกว่านี้เล็กน้อยควรใช้กับ Python 2 และ 3 ทุกรุ่น

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

BTW คุณอาจถูกล่อลวงให้ใช้platform.architecture()สิ่งนี้ แต่น่าเสียดายที่ผลของมันไม่ได้เสมอน่าเชื่อถือและโดยเฉพาะอย่างยิ่งในกรณีของไบนารี 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

14
การใช้ sys.maxint จะไม่ทำงานเพื่อตรวจจับ Python 64- บิตเมื่อใช้งาน Windows (ดูที่นี่ ) ให้ใช้ struct.calcsize ("P") แทนโซลูชันข้ามแพลตฟอร์ม
ลุคมัวร์

ขอบคุณสำหรับการตรวจสอบ ฉันได้แก้ไขคำตอบอย่างมากเพื่อแสดงการsys.maxsizeทดสอบที่เป็นเอกสารสำหรับ Python 2.6+ และการstructทดสอบที่ใช้โดยplatformโมดูลซึ่งใช้งานได้กับ Python 2 รุ่นเก่ากว่า
Ned Deily

นี้ไม่ได้ทำงานใน IronPython, sys.maxsize คือ 2 ** 31 สำหรับทั้ง 32 บิตและ 64 บิต IronPython
Meh

4
Yinon มันเป็นเรื่องจริง แต่นั่นไม่ใช่คำถามที่ถาม และสำหรับซีพียูเหล่านั้นที่เป็นไปได้ที่จะเรียกใช้บอกว่าไบนารีทั้งแบบ 32 บิตหรือ 64 บิตส่วนโค้งของเครื่องมักจะไม่เกี่ยวข้องกับโปรแกรม Python สิ่งที่สำคัญคือสิ่งที่ตัวแปลของ Python กำลังทำงานอยู่
Ned Deily

6
บน windows cmd คุณต้องใส่เครื่องหมายคำพูดคู่ด้านนอกและเครื่องหมายอัญประกาศเดี่ยวด้านในหรือมิฉะนั้นจะทำให้เกิดข้อผิดพลาดทางไวยากรณ์ นั่นอาจเป็นเพราะ windows คิดว่าช่องว่างระหว่างอัญประกาศเดี่ยวยังคงเป็นตัวคั่นอาร์กิวเมนต์ อาจเป็นประโยชน์ในการปรับคำตอบนี้เพื่อรองรับข้อเท็จจริงนั้น
Steven Bluen

255

เมื่อเริ่มต้น Python interpreter ในบรรทัด terminal / command คุณอาจเห็นบรรทัดดังนี้:

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

[MSC v.1500 64 bit (AMD64)]Python 64- บิตอยู่ที่ไหน ใช้งานได้กับการตั้งค่าเฉพาะของฉัน


6
ดังนั้นนี่คืออะไร หลาม 64 บิตหรือ 32 บิตหลาม?
phpJs

9
@phpJs 64 บิตเนื่องจาก[MSC v.1500 64 bit (AMD64)]
Eduard Florinescu

19
น่าเสียดายใช้งานได้กับ Python เวอร์ชัน Windows เท่านั้น การติดตั้ง OSX ของฉันกลับมาPython 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
บน cygwin คุณจะได้รับคำตอบนี้:Python 2.7.8 (default, Jul 25 2014, 14:04:36) [GCC 4.8.3] on cygwin
Jonno_FTW

1
sys.versionข้อมูลนี้สามารถพบได้ออกมาในรหัสโดยการเรียก ฉันได้รับตัวอย่าง('3.4.4 |Continuum Analytics, Inc.| (default, Feb 16 2016, 09:54:04) [MSC ' 'v.1600 64 bit (AMD64)]')หรือ2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)]
otterb

191

โดยทั่วไปจะแตกต่างกันไปตามคำตอบของ Matthew Marshall (ด้วย struct จาก std.library):

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

1
Imho ดีกว่ารุ่น ctypes - ใช้ได้กับ Python รุ่นเก่า
yk4ever

7
มีประโยชน์มากสามารถใช้งานได้ในหนึ่งบรรทัด โครงสร้างการนำเข้า $ python -c '; พิมพ์ struct.calcsize ("P") * 8 '
Sun Liwen

1
พิมพ์ (struct.calcsize ("P") * 8) ดีกว่า
HelloWorld

2
ดังนั้นให้คัดลอก oneliner สำหรับ Python3:python -c "import struct; print(struct.calcsize('P')*8)"
Neinstein

78

ลองใช้ ctypes เพื่อให้ได้ขนาดของตัวชี้ void:

import ctypes
print ctypes.sizeof(ctypes.c_voidp)

มันจะเป็น 4 สำหรับ 32 บิตหรือ 8 สำหรับ 64 บิต


1
ใช้งานได้เช่นกันแม้ว่าจะมีข้อเสียเล็กน้อยที่เป็นไปได้ของการนำเข้าและโหลดโมดูลที่ไม่จำเป็นหากคุณไม่ต้องการ ctypes: โมดูล sys, otoh ถูกรวบรวมเป็นล่าม
เน็ด Deily

โปรดช่วยฉันเข้าใจในการติดตั้ง 64b ของฉันpython -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp)'ผลตอบแทน8 หรือควรจะเป็นpython -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp) * 8'?
lukmdo

ฟังก์ชันส่งคืนขนาดเป็นไบต์ (4 หรือ 8) หากคุณต้องการขนาดเป็นบิต (32 หรือ 64) คุณต้องคูณด้วย 8 b_is_python_64bit = (ctypes.sizeof (ctypes.c_voidp) == 8)
phobie

1
เพียงแค่โทรpython -c "import ctypes; print(32 if ctypes.sizeof(ctypes.c_voidp)==4 else 64, 'bit CPU')"
vitiral

55

เปิดคอนโซลหลาม:

import platform
platform.architecture()[0]

ควรแสดง '64 บิต' หรือ '32 บิต' ตามแพลตฟอร์มของคุณ

อีกทางหนึ่ง ( ในกรณีของ OS X ไบนารี ):

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

โมดูล patform นั้นไม่น่าเชื่อถือเสมอไปที่ docs docs.python.org/2/library/platform.htmlเอกสารนี้เป็นจริงสำหรับแอปพลิเคชั่น Windows บางตัวด้วย
GM

18

สำหรับวิธีแก้ปัญหาที่ไม่มีการเขียนโปรแกรมให้ดูในการตรวจสอบกิจกรรม มันแสดงรายการสถาปัตยกรรมของกระบวนการ 64 บิตเป็น“ Intel (64 บิต)”


1
คำตอบทางเลือกที่ดีมากสำหรับพวกเราที่ใช้ Mac OS 10.xx ขอบคุณ!
mkelley33

16

บนระบบ Centos Linux ของฉันฉันได้ทำสิ่งต่อไปนี้:

1) เริ่มล่าม Python (ฉันใช้ 2.6.6)
2) เรียกใช้รหัสต่อไปนี้:

import platform
print(platform.architecture())

และมันก็ทำให้ฉัน

(64bit, 'ELF')

วิธีแก้ปัญหานี้ไม่ได้อธิบายว่าไม่ทำงานสำหรับเขาโดย OP หรือไม่
Antony Hatchkins

อาจเป็นได้ แต่นี่คือสิ่งที่ฉันต้องการ ขออภัยที่ +1 "คำตอบที่ผิด" แต่ฉันต้องการสิ่งนี้ไม่ดี
UnsettlingTrend

วิธีนี้เหมาะสำหรับโซลาริส 11
Steven Wolfe

11

platform.architecture() บันทึกพูดว่า:

หมายเหตุ: บน Mac OS X (และบางทีอาจเป็นแพลตฟอร์มอื่น) ไฟล์ที่ปฏิบัติการได้อาจเป็นไฟล์สากลที่มีสถาปัตยกรรมจำนวนมาก

ในการรับข้อมูลที่“ 64-bitness” ของล่ามในปัจจุบันนั้นมีความน่าเชื่อถือมากกว่าในการค้นหาแอตทริบิวต์ sys.maxsize:

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

11

จัดกลุ่มทุกอย่าง ...

พิจารณาว่า:

  • คำถามถูกถามสำหรับOSX (ฉันมีVMเก่า (และถอดรหัส) กับเวอร์ชันPythonโบราณ
  • env หลักของฉันคือWin
  • ฉันเพิ่งติดตั้งรุ่น32 บิตบนWin (และฉันได้สร้าง "crippled" หนึ่งบนLnx )

ฉันจะเป็นตัวอย่างในทุก 3 แพลตฟอร์มใช้งูหลาม 3และงูหลาม 2

  1. ตรวจสอบ[Python 3.Docs]: sys maxsizeค่า - เปรียบเทียบกับ0x100000000( 2 ** 32) มากขึ้นสำหรับ64bitขนาดเล็กสำหรับ32bit :
    • OSX 9 x64 :
      • Python 2.7.10 x 64 :
        >>> 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 :
      • 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 calcsize ( รูปแบบ )เพื่อกำหนดขนาดวัตถุที่ผลิตโดยรูปแบบ (ตัวชี้) กล่าวอีกนัยหนึ่งกำหนดขนาดของตัวชี้ ( sizeof(void*)):
    • OSX 9 x64 :
      • Python 2.7.10 x 64 :
        >>> 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 :
      • 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. ใช้[หลาม 3.Docs]: ctypes - ห้องสมุดฟังก์ชั่นต่างประเทศสำหรับงูหลาม นอกจากนี้ยังลดขนาดลงเพื่อกำหนดขนาดของตัวชี้ ( sizeof(void*)) ในฐานะที่เป็นโน้ตctypesใช้# 2 (ไม่จำเป็นสำหรับงานนี้) ผ่าน"$ {PYTHON_SRC_DIR} / Lib / ctypes / __ init__.py" (ประมาณบรรทัดที่15 ):
    • OSX 9 x64 :
      • Python 2.7.10 x 64 :
        >>> 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 :
      • 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]: แพลตฟอร์ม สถาปัตยกรรม ( executable = sys.executable, bits = '', linkage = '' ) !!! ไม่น่าเชื่อถือในOSX !!! เนื่องจากรูปแบบที่สามารถใช้งานได้หลายอาร์ค (หรือ. dylib ) (ในบางกรณีใช้ # 2 ):
    • OSX 9 x64 :
      • Python 2.7.10 x 64 :
        >>> 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 :
      • Python 3.5.4 x64 :
        >>> import platform
        >>> platform.architecture()
        ('64bit', 'WindowsPE')
      • Python 3.6.2 x86 :
        >>> import platform
        >>> platform.architecture()
        ('32bit', 'WindowsPE')


  1. วิธีแก้ปัญหา Lame ( gainarie ) - เรียกใช้คำสั่งภายนอก ( [man7]: FILE (1) ) ผ่าน[Python 3.Docs]: os ระบบ ( คำสั่ง ) ข้อ จำกัด ของ# 4ใช้ (บางครั้งอาจไม่ทำงาน):
    • OSX 9 x64 :
      • Python 2.7.10 x 64 :
        >>> 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 :
      • ไฟล์ยูทิลิตี้ไม่เป็นปัจจุบันมี 3 อื่น ๆRDเครื่องมือของบุคคลที่สามารถนำมาใช้ แต่ฉันไม่ได้ไปยืนยันกับพวกเขา


ชนะเฉพาะ:

  1. ตรวจสอบ env vars (เช่น% PROCESSOR_ARCHITECTURE% (หรืออื่น ๆ )) ผ่าน[Python 3.Docs]: os สภาพแวดล้อม :
    • ชนะ 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 รุ่น (ยังแสดงใน 1 เซนต์สายเมื่อเริ่มต้นล่าม)
    • ตรวจสอบ# 1

7

struct.calcsize("P")ส่งคืนขนาดของไบต์ที่จำเป็นในการจัดเก็บตัวชี้เดียว บนระบบ 32- บิตมันจะกลับ 4 ไบต์ บนระบบ 64- บิตมันจะกลับ 8 ไบต์

ดังนั้นต่อไปนี้จะกลับมา32ถ้าคุณใช้ไพ ธ อน 32- บิตและ64ถ้าคุณใช้ไพ ธ อนแบบ 64- บิต:

Python 2

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

Python 3

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

5

ทำpython -VVในบรรทัดคำสั่ง มันควรจะคืนเวอร์ชั่น


สิ่งนี้ไม่แสดงวิธีการภายใน Python
ParkerD

ดูเหมือนจะไม่ได้ให้ข้อมูลที่จำเป็นในการตอบคำถาม
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





1

สถาปัตยกรรมแพลตฟอร์มไม่ใช่วิธีที่เชื่อถือได้ แทนเรา:

$ 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() เป็นปัญหา (และแพง)

ทดสอบอย่างสะดวกsys.maxsize > 2**32ตั้งแต่ Py2.6

นี่คือการทดสอบที่เชื่อถือได้สำหรับที่เกิดขึ้นจริง (เริ่มต้น) ขนาดตัวชี้และเข้ากันได้อย่างน้อยก็ตั้งแต่ struct.calcsize('P') == 8Py2.3: นอกจากนี้: ctypes.sizeof(ctypes.c_void_p) == 8.

หมายเหตุ: สามารถสร้างได้ด้วยตัวเลือก gcc -mx32หรือมากกว่านั้นซึ่งเป็นแอปพลิเคชันสถาปัตยกรรม 64 บิต แต่ใช้พอยน์เตอร์ 32 บิตเป็นค่าเริ่มต้น (บันทึกหน่วยความจำและความเร็ว) 'sys.maxsize = ssize_t' อาจไม่แสดงขนาดตัวชี้ C อย่างเคร่งครัด (โดยปกติจะ2**31 - 1อยู่แล้ว) และมี / เป็นระบบที่มีขนาดตัวชี้ที่แตกต่างกันสำหรับรหัสและข้อมูลและจำเป็นต้องชี้แจงว่าอะไรคือจุดประสงค์ของการ "32 บิตหรือโหมด 64 บิต"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.