在Python中,如何确定内核是以32位还是64位模式运行?

13

我在 Linux、Mac OS 和 Windows 上使用 Python 2.6,需要确定内核是在32位还是64位模式下运行。是否有简单的方法来实现此目的?

我查看了 platform.machine(),但在 Windows 上无法正常工作。

我也看过 platform.architecture(),但在 64 位 Windows 上运行32位 Python 时无法正常工作。

注意:看起来 Python 2.7 有一个修复程序,可以使 platform.architecture() 正常工作。不幸的是,我现在至少需要使用 Python 2.6。

(编辑:从线下交流中得知,似乎没有一个全面的仅使用 Python 方式来进行这种确定而不采用恶意黑客手段的方法。我只是好奇那些使用 Python 2.6 的项目中人们使用了哪些恶意黑客手段。例如,在 Windows 上可能需要查看 PROCESSOR_ARCHITEW6432 环境变量并检查是否为 AMD64)


1
可能是重复的问题:在Python中检测64位操作系统(Windows) - Trufa
1
请查看被接受的答案中的注释,这在64位操作系统中可能并不是那么直截了当。 - Trufa
“在Python中检测64位操作系统(Windows)”的被接受答案对我并不起作用,因此它不完全是一个重复问题。” - Matt Ball
尝试运行 platform.architecture()[0] - Trufa
当在64位Windows上运行32位Python时,运行platform.architecture()[0]会得到“32bit”。这似乎更多地告诉我有关Python本身而不是正在运行的内核。 - Matt Ball
Detect 64bit OS (windows) in Python的被接受答案是错误的,这已经在那里声明过了。cgohlke的答案是最好的。 - phobie
5个回答

8

如何解决issue7860问题?

import os
import sys
import platform

def machine():
    """Return type of machine."""
    if os.name == 'nt' and sys.version_info[:2] < (2,7):
        return os.environ.get("PROCESSOR_ARCHITEW6432", 
               os.environ.get('PROCESSOR_ARCHITECTURE', ''))
    else:
        return platform.machine()

def os_bits(machine=machine()):
    """Return bitness of operating system, or None if unknown."""
    machine2bits = {'AMD64': 64, 'x86_64': 64, 'i386': 32, 'x86': 32}
    return machine2bits.get(machine, None)

print (os_bits())

1
非常感谢您提供的解决方案!我认为我们快要成功了!这个解决方案很好,除了它返回像“i386”、“x86_64”、“AMD64”和“x86”这样的字符串,这使得很难快速确定内核是在32位还是64位模式下运行。也许可以做一些类似于如果架构中有“64”,则返回64,否则返回32的操作。我不知道这个解决方案是否涵盖了所有情况,但它确实涵盖了我迄今为止看到的情况。例如:如果先前的返回值中包含“64”,则返回64。 - Matt Ball
感谢您做额外的工作!我认为这个可以得到奖金,不过我很好奇是否还有其他可能的值适用于platform.machine()或PROCESSOR_ARCHITECTURE/PROCESSOR_ARCHITEW6432。 - Matt Ball
platform.machine() 可以返回与 posix 命令 uname -m 返回的任何内容相同。PROCESSOR_ARCHITECTURE 可以是 AMD64、IA64 或 x86。我认为 PROCESSOR_ARCHITEW6432 只能是 AMD64 或空。在 Windows on ARM 上可能会有新的值。 - phobie
好的,由于现在Python >= 2.7已经很普遍了,我们可以直接使用platform.machine()并使用您的翻译字典。顺便说一下,根据Python 2.7的平台模块源代码,platform.machine()等同于platform.uname()[4] - Dr. Jan-Philip Gehrcke

7
>>> import platform
>>> platform.architecture()
('32bit', 'ELF')

1
确认在Windows中也可以正常工作 ('64位', 'WindowsPE') - Kimvais
1
不行:我刚在我的64位Windows 7电脑上尝试了一下,结果是这样的:python -c "import platform; print platform.architecture()" ('32bit','WindowsPE') - Matt Ball
3
我在64位Windows上运行32位python(我的环境有:PROCESSOR_ARCHITEW6432=AMD64)。在这种情况下,Python本身是32/64位并不重要,我需要的是内核。 - Matt Ball
1
在我的 Mac 上,Python 2.5 返回 ('32bit', ''),而 Python 2.6 返回 ('64bit', '')。因此,这段代码只会给出 Python 解释器的模式,而不是内核。 - jazz
1
@Gabi:感谢您的尝试,但不幸的是,这个技巧只能指示Python是否编译为32位或64位。在我的64位Windows系统上,使用32位Python 2.6运行此代码时,我得到了false。 - Matt Ball
显示剩余4条评论

5
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import platform
>>> platform.uname()[4]
'AMD64'

这是在64位Windows操作系统上,使用Python 32位版本。


当我在64位Windows上从32位Python运行此代码时,得到的结果是“x86”。 - Matt Ball
1
Python的版本是多少?这个问题最近已经被“修复”了在这里 - Santa
我正在运行Python 2.6:ActivePython 2.6.2.2(ActiveState Software Inc.)基于Python 2.6.2(r262:71600,2009年4月21日,15:05:37)[MSC v.1500 32位(Intel)]在win32上。 - Matt Ball
1
这就是为什么它没有起作用。 "修复" 只适用于 2.7+ 分支。在此之前,内置函数只能查询 Python 的架构,而不能查询底层操作系统(除非您使用像 pywin32 这样的库直接调用操作系统,或者使用其他不正当手段)。 - Santa
目前我只能使用Python 2.6,所以可能需要采用一些不太正规的方法。但是感谢提供Python 2.7修复链接。如果升级不太痛苦的话,我们可以尝试升级。 - Matt Ball
1
platform.machine() 是 platform.uname()[4] 的别名。这些函数需要至少 Python 2.7 版本才能正常工作。 - phobie

0

我希望这可以解决问题,我在我的Windows 8.1 64位上尝试了它,并为我返回了值AMD64

import _winreg
def get_registry_value(key, subkey, value):

  key = getattr(_winreg, key)
  handle = _winreg.OpenKey(key, subkey )
  (value, type) = _winreg.QueryValueEx(handle, value)
  return value

windowsbit = get_registry_value(
"HKEY_LOCAL_MACHINE",
"SYSTEM\\CurrentControlSet\Control\\Session Manager\\Environment",
"PROCESSOR_ARCHITECTURE")
print windowsbit

如果你正在使用64位Windows机器,请运行此代码,它会打印出AMD64。

如果你正在使用32位系统,它将会打印x86。

我希望这个代码能够完全解决这个问题。


为什么这个被踩了?在我看来,它解决了问题。 - bballdave025
我做了 :) 希望它有帮助。 - bballdave025

-1
我们可以使用以下API来检测当前是32位还是64位。

platform.architecture()[0]

'64位


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接