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


420

我需要一种方法,从外壳程序中告诉外壳程序处于哪种模式。

我尝试查看平台模块,但似乎只告诉您“有关可执行文件所用的位体系结构和链接格式”的信息:尽管二进制文件编译为64位(我在OS X 10.6上运行),所以即使我使用此处介绍的方法强制使用32位模式,它似乎总是报告64 位。


1
只是出于兴趣:您为什么需要知道?
Lennart Regebro 09年

2
我在OS X 10.6上构建和加载某些模块时遇到问题。特别是pysco,它抱怨我以64位模式运行。这也是在virtualenv下,所以我需要解决一些额外的复杂问题……
jkp

2
我想知道,因为当我使用PyInstaller之类的东西来创建独立的二进制可分发文件(以提供给可能未安装(正确版本的)Python的用户时,我生成的二进制文件取决于32/64位)在运行PyInstaller的Python上,理想情况下,我想我想自动将生成的二进制/归档文件命名为文件名中的“ 32”或“ 64”,而不必根据我的位置手动重命名文件从执行“ make”命令
乔纳森·哈特利

Answers:


412

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

14
运行Windows时,使用sys.maxint无法检测到64位Python(请参阅此处)。而是使用struct.calcsize(“ P”)作为跨平台解决方案。
路加·摩尔

感谢您的检查。我已经大幅修改了答案,以显示现在记录sys.maxsize的Python 2.6+测试和struct由所使用的测试platform也适用于旧版本的Python 2的模块
斯内德Deily

这在IronPython中不起作用,对于32位和64位IronPython,sys.maxsize均为2 ** 31
Meh 2014年

4
依农,是的,但这不是问题所要的。而且,在那些可以运行32位或64位二进制文​​件的CPU上,机器的架构通常与Python程序无关。重要的是Python解释器本身的运行方式。
Ned Deily 2015年

6
在Windows cmd上,您需要在外部加上双引号,在内部加上单引号,否则会产生语法错误。这可能是因为Windows认为单引号之间的空格仍然是参数定界符。调整此答案以适应该事实可能会有所帮助。
史蒂文·布兰

254

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


6
那是什么?64位python还是32位python?
phpJs

9
@phpJs 64位,因为[MSC v.1500 64 bit (AMD64)]
Eduard Florinescu

19
不幸的是,仅适用于Windows版本的Python。我的OSX安装恢复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
2014年

6
在cygwin上,您得到以下答案:Python 2.7.8 (default, Jul 25 2014, 14:04:36) [GCC 4.8.3] on cygwin
Jonno_FTW 2014年

1
可以通过调用在代码中找到此信息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)]
otterb '16

190

基本上是马修·马歇尔(Matthew Marshall)回答的变体(带有来自标准库的结构):

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

1
Imho比ctypes版本更好-即使在较旧的Python上也可以使用。
yk4ever

7
非常有用,可以在一行中使用。$ python -c'导入结构; 打印struct.calcsize(“ P”)* 8'–
Sun Liwen

1
print(struct.calcsize(“ P”)* 8)更好。
HelloWorld

2
因此,为Python3复制粘贴oneliner:python -c "import struct; print(struct.calcsize('P')*8)"
Neinstein's

78

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

import ctypes
print ctypes.sizeof(ctypes.c_voidp)

对于32位将是4,对于64位将是8。


1
即使您确实不需要ctypes,如果确实有不必要的导入和模块加载的可能的轻微缺点,它也可以工作:sys模块otoh被编译到解释器中。
内德·迪利

请帮助我理解:在我的64b安装上python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp)'返回8。还是应该python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp) * 8'
lukmdo 2012年

该函数返回以字节为单位的大小(4或8)。如果您需要以(32或64)为单位的大小,则必须乘以8。b_is_python_64bit =(ctypes.sizeof(ctypes.c_voidp)== 8)
phobie 2012年

1
只需致电python -c "import ctypes; print(32 if ctypes.sizeof(ctypes.c_voidp)==4 else 64, 'bit CPU')"
2014年


18

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


1
对于使用Mac OS 10.xx的我们来说,这是一个非常不错的替代答案。谢谢!
mkelley33

16

在我的Centos Linux系统上,我做了以下工作:

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

import platform
print(platform.architecture())

它给了我

(64bit, 'ELF')

OP不会将此解决方案描述为对他不起作用吗?
Antony Hatchkins '16

可能就是这样,但这正是我所需要的。很抱歉为一个“错误答案” +1,但是我非常需要这样做。
Unsettling趋势

该解决方案是完美的Solaris 11中
史蒂芬·沃尔夫

11

platform.architecture() 笔记说:

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

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

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

11

分组一切...

考虑到:

  • 询问OSX的问题(我有一个旧的(且已破解的)VM,带有一个古老的Python版本)
  • 我的主要环境是Win
  • 我在Win上仅安装了32位版本(并且在Lnx上构建了一个“残缺的” 版本

我将使用Python 3Python 2在所有3个平台上进行示例。

  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]:结构。calcsizeformat确定由(指针)格式产生的对象大小。换句话说,确定指针大小(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]:平台。架构可执行文件= sys.executable,位='',链接='' !!! 在OSX上不可靠!由于采用多体系结构可执行文件(或.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. me脚的解决方法(gainarie)- 通过[Python 3.Docs]:os调用外部命令([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-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
      • 文件工具不存在,还有其他第三方工具可以使用,但我不会坚持使用它们


具体

  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条第一线启动解释时)
    • 检查#1。

7

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

因此,32如果您运行的是32位python并且64运行的是64 位python,则会返回以下内容:

Python 2

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

Python 3

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


4
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后


4
import sys
print(sys.version)

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


不适用于OSX
CristiFati


2

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

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

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)

0

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位指针(节省内存和速度)。'sys.maxsize = ssize_t'可能不严格表示C指针大小(2**31 - 1无论如何通常如此)。而且,有些系统的代码和数据的指针大小不同,因此需要澄清辨别“ 32位或64位模式”的目的是什么?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.