【问题标题】:In Python, how do you determine whether the kernel is running in 32-bit or 64-bit mode?在 Python 中,如何确定内核是在 32 位还是 64 位模式下运行?
【发布时间】:2011-08-23 17:08:37
【问题描述】:

我在 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)

【问题讨论】:

  • 在接受的答案中查看 cmets,这在 64 位操作系统中可能会也可能不会那么简单。
  • 接受的“在 Python 中检测 64 位操作系统(Windows)”的答案对我不起作用,所以它不是完全重复的。
  • 试试platform.architecture()[0]
  • 在 64 位 Windows 上从 32 位 python 运行 platform.architecture()[0] 时,我得到 '32bit'。这似乎告诉我更多关于 python 本身的信息,而不是正在运行的内核。

标签: python


【解决方案1】:

如何解决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())

【讨论】:

  • 非常感谢您的解决方案!我想我们快到了!这个解决方案很好,除了它返回像'i386'、'x86_64'、'AMD64'和'x86'这样的字符串,这使得很难快速确定内核是在32位还是64位模式下运行。如果架构中包含“64”,也许可以执行类似返回 64 的操作,否则返回 32。我不知道该解决方案是否涵盖所有情况,但它确实涵盖了我到目前为止已经看到了。示例:如果 previous_return_value 中为 '64',则返回 64,否则为 32
  • 感谢您做的额外工作!我认为这个得到了钱,尽管我很好奇是否有其他人知道 platform.machine() 或 PROCESSOR_ARCHITECTURE/PROCESSOR_ARCHITEW6432 的其他可能值。
  • platform.machine() 可以返回 posix 命令 uname -m 返回的任何内容。 PROCESSOR_ARCHITECTURE 可以是 AMD64、IA64 或 x86。我认为 PROCESSOR_ARCHITEW6432 只能是 AMD64 或为空。 ARM 上的 Windows 可能会有新值。
  • 好的,由于 Python >= 2.7 现在已经相当标准,我们可以直接使用platform.machine() 并使用您的翻译词典。 FWIW,根据 Python 2.7 的平台模块的源代码,platform.machine() 等价于platform.uname()[4]
【解决方案2】:
>>> import platform
>>> platform.architecture()
('32bit', 'ELF')

【讨论】:

  • 确认这也适用于 Windows ('64bit', 'WindowsPE')
  • 没有骰子:我刚刚在我的 64 位 Windows 7 机器上尝试了这个并得到了这个结果: python -c "import platform; print platform.architecture()" ('32bit', 'WindowsPE' )
  • 我在 64 位窗口上运行 32 位 python(我的环境有这个:PROCESSOR_ARCHITEW6432=AMD64)。在这种情况下,python本身是不是32/64位都无所谓,我追求的是内核。
  • 在我的 Mac 上,我得到 Python 2.5 ('32bit', '') 和 Python 2.6 ('64bit', '')。所以这段代码只给你Python解释器的模式,而不是内核。
  • @Gabi:感谢您的尝试,但不幸的是,此技巧仅指示 python 是为 32 位还是 64 位编译的。在带有 32 位 python 2.6 的 64 位 Windows 系统上,运行此代码时出现错误。
【解决方案3】:
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 位窗口上从 32 位 python 运行它时,我得到 'x86'。
  • 什么版本的 Python?这是最近“修复”的here
  • 我正在运行 python 2.6:ActivePython 2.6.2.2 (ActiveState Software Inc.) 基于 Python 2.6.2 (r262:71600, Apr 21 2009, 15:05:37) [MSC v. 1500 32 位 (Intel)] 在 win32 上
  • 这就是它不起作用的原因。 “修复”仅进入 2.7+ 分支。在此之前,内置函数只能查询 Python 的架构,而不能查询底层操作系统(除非您使用 pywin32 之类的库直接调用操作系统,或其他肮脏的 hack)。
  • platform.machine() 是 platform.uname()[4] 的别名。这些函数至少需要 Python 2.7 才能正常工作。
【解决方案4】:

我希望这可以解决我在 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

我希望这段代码可以帮助彻底解决这个问题

【讨论】:

  • 为什么这被否决了?在我看来,它解决了问题。
  • 我做了 :) 我希望它有所帮助。
【解决方案5】:

我们可以使用follow API来检测当前是32位还是64位

platform.architecture()[0]

'64位

【讨论】:

    猜你喜欢
    • 2012-11-30
    • 1970-01-01
    • 2011-04-19
    • 2011-04-04
    • 2012-08-01
    • 2017-06-29
    • 2011-11-12
    • 2011-02-21
    • 2010-10-23
    相关资源
    最近更新 更多