我怎么能从壳内告诉壳处于什么模式?

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


一种方法是看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解释器时,你可能还会看到这样一行:

win32上的Python 2.7.2(默认,2011年6月12日,14:24:46)[MSC v.1500 64位(AMD64)]

其中[MSC v.1500 64位(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系统上,我做了以下操作: 1)启动Python解释器(我使用2.6.6) 2)运行如下代码:

import platform
print(platform.architecture())

它给了我

(64bit, 'ELF')

Platform.architecture()注释说:

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

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

打开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

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 .1900 64位(AMD64)]


平台架构不是可靠的方法。 相反,我们:

$ 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版本) 我的“主要”环境是赢 我只在Win上安装了032bit (Python)版本(我在Linux (Ubuntu)上构建了一个“残缺的”版本)

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

1. 检查(Python。文档:sys.maxsize

将值与0x100000000(4294967296或2 ** 32)比较:

大于064bit (pc064) 032位(pc032)

例子:

OSX 9 pc064: Python 2.7.10 pc064: >>> 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) Ubuntu 16 pc064: Python 3.5.2 pc064: >>> 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 pc032: >>> 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) Win 10 pc064: Python 3.5.4 pc064: >>> 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 pc032: >>> 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)

2. 使用Python。文档:struct.calcsize(格式)

确定由(指针)格式产生的对象大小。换句话说,决定指针的大小(sizeof(void*))。

例子:

osx9 pc064: Python 2.7.10 pc064: >>>导入结构 struct.calcsize("P") * 8 64 Ubuntu 16 pc064: Python 3.5.2 pc064: >>>导入结构 struct.calcsize("P") * 8 64 Python 3.6.4 pc032: >>>导入结构 struct.calcsize("P") * 8 32 Win 10 pc064: Python 3.5.4 pc064: >>>导入结构 struct.calcsize("P") * 8 64 Python 3.6.2 pc032: >>>导入结构 struct.calcsize("P") * 8 32

3.使用Python。ctypes - Python的外部函数库

它还可以归结为确定指针的大小(sizeof(void*))。

CTypes边注:

可以使用第二条。在某些情况下(通过[GitHub]: python/cpython - (main) cpython/Lib/ctypes/__init__.py) 检查[SO]:在使用Python通过ctypes调用的C函数时(在更复杂的情况下(例如调用函数)),对于常见的错误,返回不正确的值(@CristiFati的答案) [SO]:来自Python的C类型整数的最大值和最小值(@CristiFati的答案)可能也很有趣

例子:

osx9 pc064: Python 2.7.10 pc064: >>>导入ctypes >>> ctypes.sizeof(ctypes.c_void_p) * 8 64 Ubuntu 16 pc064: Python 3.5.2 pc064: >>>导入ctypes >>> ctypes.sizeof(ctypes.c_void_p) * 8 64 Python 3.6.4 pc032: >>>导入ctypes >>> ctypes.sizeof(ctypes.c_void_p) * 8 32 Win 10 pc064: Python 3.5.4 pc064: >>>导入ctypes >>> ctypes.sizeof(ctypes.c_void_p) * 8 64 Python 3.6.2 pc032: >>>导入ctypes >>> ctypes.sizeof(ctypes.c_void_p) * 8 32

4. 检查(Python。文档:platform.architecture(可执行=系统。可执行文件,bits= ", linkage= ")

! !在OSX上不可靠!!由于多arch可执行文件(或.dylib)格式(在某些情况下,使用#2.)。

例子:

OSX 9 pc064: Python 2.7.10 pc064: >>> import platform >>> platform.architecture() ('64bit', '') Ubuntu 16 pc064: Python 3.5.2 pc064: >>> import platform >>> platform.architecture() ('64bit', 'ELF') Python 3.6.4 pc032: >>> import platform >>> platform.architecture() ('32bit', 'ELF') Win 10 pc064: Python 3.5.4 pc064: >>> import platform >>> platform.architecture() ('64bit', 'WindowsPE') Python 3.6.2 pc032: >>> import platform >>> platform.architecture() ('32bit', 'WindowsPE')

5. 调用外部命令

[Man7]: FILE(1) via [Python.]文档:os.system(命令) 蹩脚的变通方案(gainarie) 第4条的局限性。应用(有时甚至可能不起作用):

例子:

OSX 9 pc064: Python 2.7.10 pc064: >>> 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 Ubuntu 16 pc064: Python 3.5.2 pc064: >>> 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 pc032: >>> 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 Win 10 pc064: file utility is not present, there are other 3rd-party tools (Nix emulators: MSYS2, Cygwin, ...) that can be used, but I'm not going to insist on them

6. 检查环境变量

通过Python。文档:os.environ: 赢得具体: PROCESSOR_ARCHITECTURE%(或其他)

例子:

Win 10 pc064: Python 3.5.4 pc064: >>>导入操作系统 > > > os.environ(“PROCESSOR_ARCHITECTURE”) “AMD64” Python 3.6.2 pc032: >>>导入操作系统 > > > os.environ(“PROCESSOR_ARCHITECTURE”) “x86”

7. 检查(Python。文档:sys.version

在启动解释器时也显示在第一行 在某些平台上,它可能包含(文本的)体系结构信息 检查# 1。


Platform.architecture()是有问题的(而且昂贵)。

方便地测试sys。maxsize > 2**32自Py2.6。

这是对实际(默认)指针大小的可靠测试,至少自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解释器

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


试试这个:

import platform
platform.architecture()