在Python中检测64位操作系统(Windows)

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

非常感谢

platform模块 – 访问底层平台的标识数据

 >>> import platform >>> platform.architecture() ('32bit', 'WindowsPE') 

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

 ('32bit', 'WindowsPE') 

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

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

我认为解决这个问题的最好办法是由Mark Ribau发布。

Python 2.7和更新版本的最佳答案是:

 def is_os_64bit(): return platform.machine().endswith('64') 

在windows上,跨平台函数platform.machine()内部使用了Matthew Scoutens中使用的环境variables。

我发现以下值:

  • 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') 

要findPython解释器位版本,我使用:

 def is_python_64bit(): return (struct.calcsize("P") == 8) 

来这里寻找正确的检测,如果运行在64位窗口,编译以上所有更简洁的东西。

下面你会发现一个函数来testing如果运行在64位窗口,获得32位程序文件文件夹的函数,以及获得64位程序文件文件夹的函数; 无论运行32位或64位的Python。 当运行32位python时,大多数情况下,如果在64位上运行时报告32bit,甚至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 

注意 :是的,这有点骇人听闻。 在64位Windows上运行32位Python(至less对于我试过的各种2.x和3.x版本),所有其他“只能工作”的方法都不起作用。

编辑:
2011-09-07 – 添加了关于为什么只有这个hackish方法正常工作的说明。

 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 

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

许多build议的解决scheme(如platform.architecture())都失败了,因为它们的结果取决于您运行的是32位还是64位的Python。

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

你应该使用环境variables来访问它。 程序文件目录存储在x86 Windows的环境variablesPROGRAMFILES ,32位程序文件的目录存储在PROGRAMFILES(X86)环境variables中,可以使用os.environ('PROGRAMFILES')访问这些目录。

使用sys.getwindowsversion()PROGRAMFILES(X86)if 'PROGRAMFILES(X86)' in os.environ )的存在来确定你使用的Windows版本。

主题行询问有关检测64或32位操作系统,而正文谈到确定ProgramFiles的位置。 后者在这里有几个可行的答案。 我想添加另一个解决scheme来处理StartMenu,Desktop等以及ProgramFiles: 如何获得开始菜单程序目录的path?

按照这个文档 ,试试这个代码:

 is_64bits = sys.maxsize > 2**32 

当你需要找出有关Windows系统的东西时,通常在registry中的某个地方,根据MS文档,你应该看看( http://support.microsoft.com/kb/556009 )这个关键值:

HKLM \ HARDWARE \ DESCRIPTION \ SYSTEM \ CentralProcessor \ 0

如果是:

0x00000020(十进制中的32)

这是一个32位的机器。

只是为了更新这个旧的线程 – 看起来平台模块现在报告正确的体系结构(至less在Python 2.7.8中):

 c:\python27\python.exe -c "import platform; print platform.architecture(), platform.python_version()" ('32bit', 'WindowsPE') 2.7.6 c:\home\python278-x64\python.exe -c "import platform; print platform.architecture(), platform.python_version()" ('64bit', 'WindowsPE') 2.7.8 

(对不起,我没有代表评论的第一个答案,仍然声称是错的:)

Windows的64位版本使用称为registryredirect和reflection键的东西。 有一个名为WoW64的兼容层,可以兼容32位应用程序。 从Windows 7和Windows Server 2008 R2开始,WoW64registry项不再被反映,而是共享。 你可以在这里阅读:

registryreflection:msdn.microsoft.com/en-us/library/aa384235(v=vs.85).aspx

受影响的密钥:msdn.microsoft.com/en-us/library/aa384253(v=vs.85).aspx

wikipedia:en.wikipedia.org/wiki/WoW64

所有你需要做的就是检测这些键的存在。 你可以使用_winreg。 使用try:并尝试打开键,例如:

 try: aReg = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,"SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run") 
  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=cputype = get_registry_value( "HKEY_LOCAL_MACHINE", "SYSTEM\\CurrentControlSet\Control\\Session Manager\\Environment", "PROCESSOR_ARCHITECTURE") print windowsbit 

只需运行这个代码

如果你正在64位Windows机器上工作,这将打印AMD64

或者如果你在32位工作,它将打印AMD32

我希望这个代码可以帮助完全解决这个问题

这适用于我使用的Python版本:2.7和2.5.4

  import win32com.client import _winreg shell = win32com.client.Dispatch('WScript.Shell') proc_arch = shell.ExpandEnvironmentStrings(r'%PROCESSOR_ARCHITECTURE%').lower() if proc_arch == 'x86': print "32 bit" elif proc_arch == 'amd64': print "64 bit" else: raise Exception("Unhandled arch: %s" % proc_arch) 

我知道,在这个问题的意见,这种方法已经被使用。 这是.net框架使用的方法:

 import ctypes def is64_bit_os(): """ Returns wethever system is a 64bit operating system""" is64bit = ctypes.c_bool() handle = ctypes.windll.kernel32.GetCurrentProcess() # should be -1, because the current process is currently defined as (HANDLE) -1 success = ctypes.windll.kernel32.IsWow64Process(handle, ctypes.byref(is64bit)) #should return 1 return (success and is64bit).value print(is64_bit_os()) 

我刚刚find了另一种方法来做到这一点,这在某些情况下可能有用。

 import subprocess import os def os_arch(): os_arch = '32-bit' if os.name == 'nt': output = subprocess.check_output(['wmic', 'os', 'get', 'OSArchitecture']) os_arch = output.split()[1] else: output = subprocess.check_output(['uname', '-m']) if 'x86_64' in output: os_arch = '64-bit' else: os_arch = '32-bit' return os_arch print 'os_arch=%s' % os_arch() 

我在以下环境中testing了这个代码:

  • Ubuntu 16.04 + Python 2.7.12
  • Mac OS Sierra + Python 2.7.11
  • Windows 7 Pro 32位+ Python 2.7.5(32位)
  • Windows 10 Home 64位+ Python 2.7.13(32位)

导入平台

platform.architecture()[0]

它将根据系统架构返回“32位”或“64位”。

 import struct def is64Windows(): return struct.calcsize('P') * 8 == 64 

在Windows 64位下应该有一个目录,一个名为\Windows\WinSxS64的64位的文件夹,在Windows 32位下,它是WinSxS。

希望这可以帮助。