我如何确定我的python shell是在32位还是64位执行?

我需要一种方法从外壳内部告诉外壳处于什么模式。

虽然我主要是OS X用户,但我也有兴趣了解其他平台。

我试着看平台模块,但它似乎只告诉你“关于可执行文件使用的位架构和链接格式”:二进制文件被编译为64位(我在OS X 10.6上运行),所以它似乎总是报告64位,即使我使用这里描述方法强制32位模式)。

490070 次浏览

一种方法是查看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)

在Windows操作系统下,执行相同的命令,格式如下:

python -c "import sys;print(\"%x\" % sys.maxsize, sys.maxsize > 2**32)"

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

顺便说一句,你可能会忍不住用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

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

import ctypes
print ctypes.sizeof(ctypes.c_voidp)

32位是4位,64位是8位。

基本上是Matthew Marshall答案的变体(使用来自std.library的struct):

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

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

当在终端/命令行中启动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。

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后

在我的Centos Linux系统上,我做了以下事情: < br > < br > 1)启动Python解释器(我使用2.6.6)
2)执行如下代码:

import platform
print(platform.architecture())

它给了我

(64bit, 'ELF')

platform.architecture()注释说:

< p >注意: 在Mac OS X(也许还有其他平台)上,可执行文件可能是包含多种架构的通用文件 为了获得当前解释器的“64位”,它更可靠 查询sys. xml文件。最大尺寸属性:< / p >
import sys
is_64bits = sys.maxsize > 2**32

打开python控制台:

import platform
platform.architecture()[0]

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

__abc0 (__abc1):

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

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)
import sys
print(sys.version)

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

平台架构不是可靠的方式。 而不是我们:< / p >

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

分组的一切……

考虑到:

  • 这个问题是问OSX(我有一个旧的(和破裂的)虚拟机和一个古老的Python版本)
  • 我的主要环境是赢得
  • 我只在赢得上安装了32位版本(并且我在Lnx上构建了一个“残缺”版本)

我将在这3个平台上使用Python 3Python 2举例说明。

  1. 检查Python 3。文档:sys。<强>最大容量< / >强值-将其与0x100000000 (2 ** 32)进行比较:64位为大,32位为小:
      <李> 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)
        
        李< /引用> < / > 李< / ul > < / > <李> 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)
          
          李< /引用> < / > 李< / ul > < / > <李> win10 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)
            
            李< /引用> < / > 李< / ul > < / > 李< / ul > < / >

< br >

  1. 使用Python 3。文档):结构。<强> calcsize < /强> (< em > < / em >格式)确定(指针)格式产生的对象大小。换句话说,确定指针大小(sizeof(void*)):
      <李> OSX 9 x64:
        <李> Python 2.7.10 x64:
        >>> import struct
        >>> struct.calcsize("P") * 8
        64
        
        李< /引用> < / > 李< / ul > < / > <李> 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
          
          李< /引用> < / > 李< / ul > < / > <李> win10 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
            
            李< /引用> < / > 李< / ul > < / > 李< / ul > < / >

< br >

    <李> Python 3。ctypes - Python的外部函数库使用。它也可以归结为确定指针的大小(sizeof(void*))。需要注意的是,ctypes通过" $ {PYTHON_SRC_DIR} / Lib / ctypes / __init__ . py”(在行<强> # 15附近)使用< em > # 2。< / em >(不一定用于此任务):
      <李> OSX 9 x64:
        <李> Python 2.7.10 x64:
        >>> import ctypes
        >>> ctypes.sizeof(ctypes.c_void_p) * 8
        64
        
        李< /引用> < / > 李< / ul > < / > <李> 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
          
          李< /引用> < / > 李< / ul > < / > <李> win10 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
            
            李< /引用> < / > 李< / ul > < / > 李< / ul > < / >

< br >

  1. Python 3。文档:平台。< >强架构< /强> (< em >执行=系统。可执行文件,bits= ", linkage= " ) ! !不可靠的OSX !!由于多arch可执行文件(或. dylib)格式(在某些情况下使用< em > # 2。< / em >):
      <李> OSX 9 x64:
        <李> Python 2.7.10 x64:
        >>> import platform
        >>> platform.architecture()
        ('64bit', '')
        
        李< /引用> < / > 李< / ul > < / > <李> 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')
          
          李< /引用> < / > 李< / ul > < / > <李> win10 x64:
            <李> Python 3.5.4 x64:
            >>> import platform
            >>> platform.architecture()
            ('64bit', 'WindowsPE')
            
            李< /引用> < / > <李> Python 3.6.2 x86:
            >>> import platform
            >>> platform.architecture()
            ('32bit', 'WindowsPE')
            
            李< /引用> < / > 李< / ul > < / > 李< / ul > < / >

< br >

  1. 蹩脚的解决方法(gainarie) -通过Python 3。文档:操作系统。系统<强> < / >强(< em >命令< / em >)调用外部命令([man7]:文件(1))。< em > # 4。< / em >的限制适用(有时它甚至可能不起作用):
      <李> 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
        
        李< /引用> < / > 李< / ul > < / > <李> 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
          
          李< /引用> < / > 李< / ul > < / > <李> win10 x64:
          • 文件实用程序不存在,还有其他3理查德·道金斯 Party工具可以使用,但我不打算坚持使用它们
          • 李< / ul > < / > 李< / ul > < / >

< br >

赢得具体:

  1. 通过Python 3。文档:操作系统。< >强环境< / >强检查env变量(例如% PROCESSOR_ARCHITECTURE %(或其他)):
      <李> win10 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'
        
        李< /引用> < / > 李< / ul > < / > 李< / ul > < / >

< br >

  1. Python 3。文档:sys。< /强> < >强版本(在启动解释器时也是显示在“1st”行)
    • 检查< em > # 1。< / em >
    • 李< / ul > < / >

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位指针(节省内存和速度)。的系统。maxsize = ssize_t'可能并不严格代表C指针的大小(通常是2**31 - 1)。有些系统对代码和数据有不同的指针大小,需要澄清的是,区分“32位模式还是64位模式”的目的究竟是什么?

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

基于abe32的回答,

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

N_bits将有32或64位。

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

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

Windows 10

打开cmd终端,输入>python启动python解释器,如下图所示

 img

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

试试这个:

import platform
platform.architecture()