用Python检测64位操作系统(windows)

wil*_*oup 37 python windows 64-bit

有谁知道我将如何检测Windows在Python下的位版本.我需要知道这是一种为Program Files使用正确文件夹的方法.

非常感谢

pho*_*bie 46

我认为这个问题的最佳解决方案已由Mark Ribau发布.

Python 2.7及更新版本问题的最佳答案是:

def is_os_64bit():
    return platform.machine().endswith('64')
Run Code Online (Sandbox Code Playgroud)

在Windows上,跨平台功能在platform.machine()内部使用Matthew Scoutens答案中使用的环境变量.

我发现了以下值:

  • WinXP-32:x86
  • Vista-32:x86
  • Win7-64:AMD64
  • Debian-32:i686
  • Debian-64:x86_64

对于Python 2.6及更早版本:

def is_windows_64bit():
    if 'PROCESSOR_ARCHITEW6432' in os.environ:
        return True
    return os.environ['PROCESSOR_ARCHITECTURE'].endswith('64')
Run Code Online (Sandbox Code Playgroud)

要查找我使用的Python解释器位版本:

def is_python_64bit():
    return (struct.calcsize("P") == 8)
Run Code Online (Sandbox Code Playgroud)

  • 我认为这也不总是安全的:您可以在 64 位处理器架构上运行 32 位操作系统。 (2认同)

Joc*_*zel 39

我想你应该查看os.environ['PROGRAMFILES']程序文件文件夹.

  • +1解决问题而不是回答问题 - 并不总是一件好事,但在这种情况下它是. (12认同)
  • 仅供参考:如果您运行32位python,它将导致x86版本,但如果运行64位python则会导致x64版本. (6认同)
  • 这是正确的解决方案,而不是硬编码目录.但是,这不会导致64位Windows上的32位程序文件,如果需要的话. (3认同)

Mar*_*bau 29

来到这里搜索正确检测是否在64位窗口上运行,将上述所有内容编译成更简洁的内容.

下面你将找到一个测试是否在64位窗口上运行的函数,一个获取32位Program Files文件夹的函数,以及一个获取64bit Program Files文件夹的函数; 所有无论运行32位还是64位python.当运行32位python时,大多数事情在64位运行时报告为32位,甚至os.environ['PROGRAMFILES'].

import os

def Is64Windows():
    return 'PROGRAMFILES(X86)' in os.environ

def GetProgramFiles32():
    if Is64Windows():
        return os.environ['PROGRAMFILES(X86)']
    else:
        return os.environ['PROGRAMFILES']

def GetProgramFiles64():
    if Is64Windows():
        return os.environ['PROGRAMW6432']
    else:
        return None
Run Code Online (Sandbox Code Playgroud)

注意:是的,这有点hackish.所有其他"应该工作"的方法,在64位Windows上运行32位Python时不起作用(至少对于我尝试过的各种2.x和3.x版本).

编辑:
2011-09-07 - 添加了一个说明为什么只有这种hackish方法正常工作.


Joe*_*erg 23

platformmodule - 访问底层平台的标识数据

>>> import platform
>>> platform.architecture()
('32bit', 'WindowsPE')
Run Code Online (Sandbox Code Playgroud)

在64位Windows上,32位Python返回:

('32bit', 'WindowsPE')
Run Code Online (Sandbox Code Playgroud)

这意味着这个答案即使已被接受,也是不正确的.请参阅下面的一些答案,了解可能适用于不同情况的选项.

  • 在64位Windows上它返回相同的东西. (11认同)
  • @Tadeck你可能在64位Windows上运行64位Python. (5认同)
  • 这不起作用,因为python选择始终返回win32以获得兼容性.这也是为什么只有'hackish'方式才能找到答案的原因. (4认同)
  • @Thomas如果我执行`print platform.architecture()[0]`,它会在Windows 7 64bit上显示`64bit`. (3认同)

Mat*_*ten 8

def os_platform():
    true_platform = os.environ['PROCESSOR_ARCHITECTURE']
    try:
            true_platform = os.environ["PROCESSOR_ARCHITEW6432"]
    except KeyError:
            pass
            #true_platform not assigned to if this does not exist
    return true_platform
Run Code Online (Sandbox Code Playgroud)

http://blogs.msdn.com/b/david.wang/archive/2006/03/26/howto-detect-process-bitness.aspx

  • 这确实返回了真正的平台,即使是在64位窗口上运行的32位python也是如此; 然而,对于32位窗口的32位python,true_platform将是"x86",对于许多机器(大多数英特尔消费者CPU,大多数AMD消费者CPU),Windows 64位上的32位或64位python的"AMD64",对于32位或64位python,"I64" Windows 64位用于安腾和类似的机器.只是意识到这一点. (2认同)
  • 来源:http://msdn.microsoft.com/en-us/library/aa384274(v = vs.85).aspx (2认同)

gau*_*256 6

许多这些提议的解决方案,例如platform.architecture(),都会失败,因为它们的结果取决于您运行的是32位还是64位Python.

我发现唯一可靠的方法是检查是否存在os.environ ['PROGRAMFILES(X86)'],这是不幸的.