繁体   English   中英

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

[英]How do I determine if my python shell is executing in 32bit or 64bit?

我需要一种方法来从 shell 内部判断 shell 处于什么模式。

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

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

一种方法是查看此处记录的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

顺便说一句,您可能会为此使用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

在终端/命令行中启动 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。 适用于我的特定设置。

基本上是 Matthew Marshall 答案的一个变体(带有来自 std.library 的结构):

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

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

import ctypes
print ctypes.sizeof(ctypes.c_voidp)

32 位为 4,64 位为 8。

打开python控制台:

import platform
platform.architecture()[0]

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

或者在 OS X 二进制文件的情况下):

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

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

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

import platform
print(platform.architecture())

它给了我

(64bit, 'ELF')

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

将所有内容分组...

考虑到:

  • 这个问题是针对OSX提出的(我有一个带有古老Python版本的旧(和破解) VM
  • 我的主要环境是Win
  • 我只在Win 上安装了32 位版本(并且我在Lnx上构建了一个“残废”版本

我将在所有 3 个平台上举例说明,使用Python 3Python 2

  1. 检查[Python 3.Docs]: sys. MAXSIZE值-它比较0x1000000002 ** 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)
    • 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 ( format )来确定由 (pointer) format 产生的对象大小。 换句话说,确定指针大小( 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
    • 赢得 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. 使用[Python 3.Docs]: ctypes - 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
    • 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='', links='' !!! OSX上不可靠!!! 由于 multi arch 可执行文件(或.dylib )格式(在某些情况下,使用#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')
    • 赢得 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. 蹩脚的解决方法 ( Gainarie ) - 通过[Python 3.Docs]调用外部命令 ( [man7]: FILE(1) ) : os. 系统命令 #4的局限性 应用(有时它甚至可能不起作用):
    • 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
    • 赢得 10 x64
      • 文件实用程序不存在,还有其他 3 rd Party 工具可以使用,但我不会坚持使用它们


具体:

  1. 通过[Python 3.Docs]检查环境变量(例如%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.Docs]: sys. 版本(启动解释时也显示在第一
    • 检查#1。

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

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

platform.architecture()注释说:

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

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

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

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

Windows 10 上

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

图像

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

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

所以下面将返回32 ,如果你正在运行的32位Python和64 ,如果你正在运行的64位蟒蛇:

蟒蛇 2

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

蟒蛇 3

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

基于abe32 的回答,

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

n_bits 将有 32 位或 64 位。

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 后

import sys
print(sys.version)

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

试试这个:

import platform
platform.architecture()

平台架构不是可靠的方式。 取而代之的是我们:

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

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 位模式”的目的究竟是什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM