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

jkp*_*jkp 386 python macos

我需要一种方法来告诉shell在shell中的模式.

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

Ned*_*ily 378

更新:一种方法是看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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

顺便说一下,你可能很想用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
Run Code Online (Sandbox Code Playgroud)

  • 在运行Windows时,使用sys.maxint无法检测64位Python(参见[此处](http://stackoverflow.com/questions/3411079/why-does-the-python-2-7-amd-64卸载器-似乎对运行中的python-在32位模式)).相反,使用struct.calcsize("P")作为跨平台解决方案. (14认同)
  • 在Windows cmd上,您需要在外部放置双引号,在内部放置单引号,否则会产生语法错误.这可能是因为Windows认为单引号之间的空格仍然是参数分隔符.调整此答案以适应这一事实可能会有所帮助. (5认同)
  • 是的,sys.maxsize适用于64位Windows. (3认同)
  • Yinon,这是真的,但这不是问题所要求的.而且,在那些可以运行的CPU上,比如32位或64位二进制文​​件,机器的拱形通常与Python程序没有任何关系; 重要的是Python解释器本身运行的是什么. (3认同)

小智 237

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

  • 不幸的是,只适用于Windows版本的Python.我的OSX安装在darwin上返回`Python 2.7.8(v2.7.8:ee879c0ffa11,Jun 29,2014,21:07:35)[GCC 4.2.1(Apple In.build 5666)(第3点)] (17认同)
  • @phpJs 64位因为`[MSC v.1500 64 bit(AMD64)]` (7认同)
  • 在cygwin上,你得到了这个答案:`Python 2.7.8(默认,2014年7月25日,14:04:36)[GCC 4.8.3]关于cygwin (6认同)
  • 这是什么?64位python还是32bit python? (5认同)
  • 可以通过调用“sys.version”在代码中找到此信息。我得到例如 `('3.4.4 |Continuum Analytics, Inc.| (默认,2016 年 2 月 16 日,09:54:04) [MSC ' 'v.1600 64 位 (AMD64)]')` 或 `2.7。 5(默认,2013 年 5 月 15 日,22:43:36)[MSC v.1500 32 位(英特尔)]` (3认同)
  • 一行是 `python -c "import sys; print(sys.version)"` (2认同)

Chr*_*heD 178

基本上是马修马歇尔答案的变体(来自std.library的结构):

import struct
print struct.calcsize("P") * 8
Run Code Online (Sandbox Code Playgroud)

  • 非常实用,可以在一行中使用.$ python -c'import struct; print struct.calcsize("P")*8' (5认同)
  • print(struct.calcsize("P") * 8) 更好。 (2认同)
  • 所以复制粘贴 Python3 的 oneliner:`python -c "import struct; print(struct.calcsize('P')*8)"` (2认同)

Mat*_*all 73

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

import ctypes
print ctypes.sizeof(ctypes.c_voidp)
Run Code Online (Sandbox Code Playgroud)

32位为4或64位为8.


abe*_*312 45

打开python控制台:

import platform
platform.architecture()[0]
Run Code Online (Sandbox Code Playgroud)

它应根据您的平台显示"64位"或"32位".

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

import sys
sys.maxsize > 2**32 
# it should display True in case of 64bit and False in case of 32bit
Run Code Online (Sandbox Code Playgroud)


Pet*_*sey 17

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


小智 17

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

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

import platform
print(platform.architecture())
Run Code Online (Sandbox Code Playgroud)

它给了我

(64bit, 'ELF')
Run Code Online (Sandbox Code Playgroud)


小智 12

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

import struct
print(struct.calcsize("P") * 8)
Run Code Online (Sandbox Code Playgroud)


Cri*_*ati 10

把一切都分组......

考虑到:

  • 问题是OSX(我有一个旧的(和破解的)VM与古老的Python版本)
  • 我的主要环节是胜利
  • 我只在Win上安装了32位版本(我在Lnx上构建了一个"残缺" 版本)

我将使用Python3Python2在所有3个平台上举例说明.

  1. 检查[Python 3]:sys.maxsize value - 将其与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)
        
        Run Code Online (Sandbox Code Playgroud)
    • Ubtu 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)
        
        Run Code Online (Sandbox Code Playgroud)
      • 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)
        
        Run Code Online (Sandbox Code Playgroud)
    • 赢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)
        
        Run Code Online (Sandbox Code Playgroud)
      • 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)
        
        Run Code Online (Sandbox Code Playgroud)


  1. 使用[Python 3]:struct.calcsize(fmt)确定(指针)格式产生的对象大小.换句话说,确定指针大小(sizeof(void*)):


  1. 使用[Python 3.5]:ctypes - Python的外部函数库.它还归结为确定指针(sizeof(void*))的大小.作为一个注释,ctypes使用#2.(不一定是为了这个任务)通过"$ {PYTHON_SRC_DIR}/Lib/ctypes/__ init__.py"(第15左右):


  1. [Python 3]:平台.架构(executable = sys.executable,bits ='',linkage ='') !!! 在OSX上不可靠!!! 由于多拱可执行(或.dylib)格式(在某些情况下,使用#2.):


  1. Lame workaround(gainarie) - 通过[Python 3]: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
        
        Run Code Online (Sandbox Code Playgroud)
    • Ubtu 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
        
        Run Code Online (Sandbox Code Playgroud)
      • 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
        
        Run Code Online (Sandbox Code Playgroud)
    • 赢10 x64:
      • 文件工具不存在,还有其他第三方工具可以使用,但我不会坚持他们


赢得具体:

  1. 通过[Python 3]:os检查环境变量(例如%PROCESSOR_ARCHITECTURE%(或其他)).环境:


  1. [Python 3]:sys.版本(也显示在1条第一线启动解释时)
    • 检查#1.


小智 10

做一个python -VV命令行。它应该返回版本。

  • 这似乎没有提供回答问题所需的信息 (2认同)

Sha*_*ann 9

platform.architecture() 笔记说:

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

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

import sys
is_64bits = sys.maxsize > 2**32
Run Code Online (Sandbox Code Playgroud)


Muh*_*ooq 9

Windows 10 上

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

图像

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

  • 许多常见的 python 二进制发行版在启动时不会打印这个详细的语句 (3认同)

kim*_*udi 7

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

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

Python 2

import struct;print struct.calcsize("P") * 8
Run Code Online (Sandbox Code Playgroud)

Python 3

import struct;print(struct.calcsize("P") * 8)
Run Code Online (Sandbox Code Playgroud)


Ris*_*gar 6

基于abe32 的回答,

import sys
n_bits = 32 << bool(sys.maxsize >> 32)
Run Code Online (Sandbox Code Playgroud)

n_bits 将有 32 位或 64 位。


小智 6

尝试这个:

import platform
platform.architecture()
Run Code Online (Sandbox Code Playgroud)