如何确定我的python shell是否在OS X上以32位或64位模式执行?

时间:2009-09-10 15:14:01

标签: python macos

我需要一种方法来告诉shell在shell中的模式。

我试过看platform模块,但似乎只是告诉你“关于用于可执行文件的位体系结构和链接格式”:二进制文件编译为64位虽然(我是在OS X 10.6上运行)所以它似乎总是报告64位,即使我使用方法described here来强制32位模式。)

19 个答案:

答案 0 :(得分:362)

更新: 一种方法是查看记录为heresys.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)
在Python 2.6中引入了

sys.maxsize。如果您需要对旧系统进行测试,这个稍微复杂的测试应该适用于所有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
顺便说一句,你可能想要使用platform.architecture()。不幸的是,其结果并不总是可靠的particularly in the case of OS X universal binaries

$ 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

答案 1 :(得分:224)

在终端/命令行中启动Python解释器时,您可能还会看到如下行:

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)]表示64位Python。 适用于我的特定设置。

答案 2 :(得分:168)

基本上是马修马歇尔答案的变体(来自std.library的结构):

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

答案 3 :(得分:70)

尝试使用ctypes获取void指针的大小:

import ctypes
print ctypes.sizeof(ctypes.c_voidp)

32位为4或64位为8。

答案 4 :(得分:40)

打开python控制台:

import platform
platform.architecture()[0]

它应该显示' 64bit'或者' 32bit'根据你的平台。

另外in case of OS X binaries):

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

答案 5 :(得分:15)

对于非程序化解决方案,请查看活动监视器。它将64位进程的体系结构列为“Intel(64位)”。

答案 6 :(得分:14)

在我的Centos Linux系统上,我执行了以下操作:

1)启动Python解释器(我使用的是2.6.6)
2)运行以下代码:

import platform
print(platform.architecture())

它给了我

(64bit, 'ELF')

答案 7 :(得分:9)

对于32位,它将返回32,对于64位,它将返回64

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

答案 8 :(得分:9)

platform.architecture()说明:

  

注意:   在Mac OS X(可能还有其他平台)上,可执行文件可能是包含多种体系结构的通用文件。

     

要获得当前解释器的“64位”,它更可靠   查询sys.maxsize属性:

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

答案 9 :(得分:8)

将所有内容分组......

考虑到:

  • 问题是 OSX (我有一个旧的(和破解的) VM 与古老的 Python 版本)
  • 我的主要环节是 Win
  • 我只在 Win 上安装了 32bit 版本(我在 Lnx 上构建了一个"残缺的"一个)

我将使用 Python3 Python2 在所有3个平台上举例说明。

  1. 检查[Python 3]: sys.maxsize值 - 将其与0x1000000002 ** 32)进行比较: 64bit 更大, 32bit 更小:
    • OSX 9 x64
      • Python 2.7.10 x64
        >>> import sys
        >>> "Python {:s} on {: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)
        
    • Ubtu 16 x64
      • Python 3.5.2 x64
        >>> import sys
        >>> "Python {:s} on {: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 {:s} on {: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 {:s} on {: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 {:s} on {: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]: struct.calcsize(fmt)确定(指针)格式生成的对象大小。换句话说,确定指针大小(sizeof(void*)):
      • OSX 9 x64
        • Python 2.7.10 x64
          >>> import struct
          >>> truct.calcsize("P") * 8
          64
          
      • Ubtu 16 x64
        • Python 3.5.2 x64
          >>> import struct
          >>> truct.calcsize("P") * 8
          64
          
        • Python 3.6.4 x86
          >>> import struct
          >>> truct.calcsize("P") * 8
          32
          
      • 赢取10 x64
        • Python 3.5.4 x64
          >>> import struct
          >>> truct.calcsize("P") * 8
          64
          
        • Python 3.6.2 x86
          >>> import struct
          >>> truct.calcsize("P") * 8
          32
          

      1. 使用[Python 3.5]: ctypes - A foreign function library for Python。它还归结为确定指针的大小(sizeof(void*))。请注意, ctypes 使用 #2。 (不一定是此任务)通过" $ {PYTHON_SRC_DIR} / Lib / ctypes / __ init __。py" (围绕#15 ):
        • OSX 9 x64
          • Python 2.7.10 x64
            >>> import ctypes
            >>> ctypes.sizeof(ctypes.c_void_p) * 8
            64
            
        • Ubtu 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]: platform.architecture(executable=sys.executable, bits='', linkage='') !!!由于多拱可执行(或 .dylib )格式,在 OSX !!! 上不可靠(在某些情况下,使用 #2 ):
          • OSX 9 x64
            • Python 2.7.10 x64
              >>> import platform
              >>> platform.architecture()
              ('64bit', '')
              
          • Ubtu 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]: os.system(command))。 #4。 的限制适用(有时甚至可能不起作用):
            • OSX 9 x64
              • Python 2.7.10 x64
                >>> import os
                >>> os.system("file {:s}".format(os.path.realpath(sys.executable)))
                /opt/OPSWbuildtools/2.0.6/bin/python2.7.global: Mach-O 64-bit executable x86_64
                
            • Ubtu 16 x64
              • Python 3.5.2 x64
                >>> import os
                >>> os.system("file {: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 {: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 Party工具,但我不会坚持使用它们

          2. 赢取具体:

            1. 通过[Python 3]: os.environ检查env vars(例如%PROCESSOR_ARCHITECTURE%(或其他)):
              • 赢取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]: sys.version(启动解释器时,显示在1 st 中)
                • 检查 #1。

答案 10 :(得分:7)

struct.calcsize("P")返回存储单个指针所需的字节大小。在32位系统上,它将返回4个字节。在64位系统上,它将返回8个字节。

如果您正在运行32位python,那么以下内容将返回32,如果您正在运行64位python,则返回64

Python 2

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

Python 3

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

答案 11 :(得分:6)

基于abe32's answer,

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

n_bits将具有32或64位。

答案 12 :(得分:3)

import sys
print(sys.version)

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

答案 13 :(得分:3)

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后

答案 14 :(得分:3)

试试这个:

import platform
platform.architecture()

答案 15 :(得分:2)

Windows 操作系统

打开cmd终端并通过键入> python来启动python解释器,如下图所示

Img

如果开始时的解释器信息包含 AMD64 ,则为64位,否则为32位。

答案 16 :(得分: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)

答案 17 :(得分:1)

在命令行中执行python -VV。它应该返回版本。

答案 18 :(得分:0)

platform.architecture()有问题(且昂贵)。

从Py2.6开始,方便地测试sys.maxsize > 2**32

这是对实际(默认)指针大小的可靠测试,并且至少从Py2.3:struct.calcsize('P') == 8开始兼容。另外:ctypes.sizeof(ctypes.c_void_p) == 8

注意:可以使用gcc选项-mx32进行构建,它们是64位体系结构的应用程序,但默认使用32位指针(节省内存和速度)。 'sys.maxsize = ssize_t'可能不严格表示C指针的大小(无论如何通常为2**31 - 1)。而且,有些系统的代码和数据的指针大小不同,需要明确区分“ 32位或64位模式”的目的是什么?