在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。
希望这可以帮助。