我需要一种方法来从外壳中判断外壳处于什么模式。
虽然我主要是 OS X 用户,但我也有兴趣了解其他平台。
我试过查看 platform 模块,但它似乎只是告诉你“关于用于可执行文件的位架构和链接格式”:虽然二进制文件编译为 64 位(我在 OS X 10.6 上运行) 所以它似乎总是报告 64 位,即使我使用方法 described here 来强制 32 位模式)。
一种方法是查看 sys.maxsize
作为记录的 here:
$ 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()
。不幸的是,它的结果并不总是可靠的,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
在终端/命令行中启动 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。适用于我的特定设置。
[MSC v.1500 64 bit (AMD64)]
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
Python 2.7.8 (default, Jul 25 2014, 14:04:36) [GCC 4.8.3] on cygwin
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)]
基本上是马修马歇尔答案的一个变体(来自std.library的结构):
import struct
print struct.calcsize("P") * 8
python -c "import struct; print(struct.calcsize('P')*8)"
尝试使用 ctypes 来获取 void 指针的大小:
import ctypes
print ctypes.sizeof(ctypes.c_voidp)
32 位为 4 或 64 位为 8。
python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp)'
返回 8。还是应该是 python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp) * 8'
?
python -c "import ctypes; print(32 if ctypes.sizeof(ctypes.c_voidp)==4 else 64, 'bit CPU')"
打开python控制台:
import platform
platform.architecture()[0]
它应该根据您的平台显示“64 位”或“32 位”。
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 位进程的体系结构列为“英特尔(64 位)”。
将所有内容分组...
考虑到:
这个问题是针对 OSX 提出的(我有一个旧的(和破解的)VM 和一个古老的 Python 版本)
我的主要环境是 Win
我只在 Win 上安装了 32 位版本(我在 Lnx 上构建了一个“残缺”版本)
我将使用 Python 3 和 Python 2 在所有 3 个平台上举例说明。
检查 [Python 3.Docs]: sys.maxsize 值 - 将其与 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(默认,2015 年 10 月 14 日,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) Win 10 x64: Python 3.5.4 x64: >>> import sys >>> "Python {0:s} on {1:s}".format(sys.version , sys.platform) '毕索n 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 ', 错误的)
使用[Python 3.Docs]: struct.calcsize(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: >>> 导入结构 >>> struct.calcsize("P") * 8 64 Python 3.6.4 x86: >>> 导入结构 >>> struct.calcsize("P") * 8 32 赢10 x64: Python 3.5.4 x64: >>> 导入结构 >>> struct.calcsize("P") * 8 64 Python 3.6.2 x86: >>> 导入结构 >>> struct.calcsize("P") * 8 32
使用 [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: >>> 导入 ctypes >>> ctypes.sizeof(ctypes.c_void_p) * 8 64 Python 3.6.4 x86: >>> 导入 ctypes >> > ctypes.sizeof(ctypes.c_void_p) * 8 32 Win 10 x64: Python 3.5.4 x64: >>> 导入 ctypes >>> ctypes.sizeof(ctypes.c_void_p) * 8 64 Python 3.6.2 x86: >>>导入 ctypes >>> ctypes.sizeof(ctypes.c_void_p) * 8 32
[Python 3.Docs]:platform.architecture(executable=sys.executable, bits='', links='') !!!在 OSX 上不可靠!!!由于多架构可执行文件(或 .dylib)格式(在某些情况下,使用 #2。):OSX 9 x64: Python 2.7.10 x64: >>> import platform >>> platform.architecture() ('64bit', '') Ubuntu 16 x64: Python 3.5.2 x64: >>> 导入平台 >>> platform.architecture() ('64bit', 'ELF') Python 3.6.4 x86: >>> 导入平台 >>> 平台.architecture() ('32bit', 'ELF') Win 10 x64: Python 3.5.4 x64: >>> 导入平台 >>> platform.architecture() ('64bit', 'WindowsPE') Python 3.6.2 x86 : >>> 导入平台 >>> platform.architecture() ('32bit', 'WindowsPE')
蹩脚的解决方法 (gainarie) - 通过 [Python 3.Docs]: os.system(command) 调用外部命令 ([man7]: FILE(1))。 #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 位可执行 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) , 动态链接, 解释器 /lib64/ld-linux-x86-64.so.2, 对于 GNU/Linux 2.6.32, BuildID[sha1]=59a8ef36ca241df24686952480966d7bc0d7c6ea, 剥离 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 可执行文件,Intel 80386,版本 1 (SYSV),动态链接,解释器 /lib/ld-linux.so.2,用于 GNU/Linux 2.6.32,BuildID[sha1]=5c3d4eeadbd13cd91445d08f90722767b0747de2,未剥离 Win 10 x64:文件实用程序不是目前,还有其他 3rd 方工具可以使用过,但我不会坚持使用它们
赢具体:
通过 [Python 3.Docs] 检查环境变量(例如 %PROCESSOR_ARCHITECTURE% (或其他)): os.environ: Win 10 x64: Python 3.5.4 x64: >>> import os >>> os.environ["PROCESSOR_ARCHITECTURE" ] 'AMD64' Python 3.6.2 x86: >>> 导入操作系统 >>> os.environ["PROCESSOR_ARCHITECTURE"] 'x86'
[Python 3.Docs]:sys.version(启动解释器时也显示在第一行)检查#1。
对于 32 位,它将返回 32,对于 64 位,它将返回 64
import struct
print(struct.calcsize("P") * 8)
注意:在 Mac OS X(可能还有其他平台)上,可执行文件可能是包含多个体系结构的通用文件。要获取当前解释器的“64 位”,查询 sys.maxsize 属性更可靠:
import sys
is_64bits = sys.maxsize > 2**32
在命令行中执行 python -VV
。它应该返回版本。
Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)]
谢谢
python3.6 -VV: Python 3.6.9 (default, Jul 17 2020, 12:50:27) [GCC 8.4.0]
Python 2.7.16
在 Windows 10 上
打开 cmd 终端并通过键入 >python 启动 python 解释器,如下图所示
https://i.stack.imgur.com/QvbVD.png
如果开始时的解释器信息包含 AMD64,则为 64 位,否则为 32 位。
尝试这个:
import platform
platform.architecture()
python -c "import platform; print(platform.architecture())"
输出:('64bit', 'ELF')
struct.calcsize("P")
返回存储单个指针所需的字节大小。在 32 位系统上,它将返回 4 个字节。在 64 位系统上,它将返回 8 个字节。
因此,如果您正在运行 32 位 python,则以下内容将返回 32
,如果您正在运行 64 位 python,则返回 64
:
蟒蛇2
import struct;print struct.calcsize("P") * 8
蟒蛇 3
import struct;print(struct.calcsize("P") * 8)
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)]
平台架构不是可靠的方法。取而代之的是我们:
$ 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位模式”的确切目的是什么?
不定期副业成功案例分享
sys.maxsize
测试和platform
模块使用的struct
测试,它也适用于旧版本的 Python 2。