Python:获取Windows操作系统版本和架构

9
首先,我认为这个问题不是Detect 64bit OS (windows) in Python的重复,因为在我看来它并没有得到彻底的回答。
唯一接近的答案是:
使用sys.getwindowsversion()或PROGRAMFILES(X86)的存在(if 'PROGRAMFILES(X86)' in os.environ)
但是:
Windows环境变量PROGRAMFILES(X86)可靠吗?我担心任何人都可以创建它,即使它不存在于系统中。
如何使用sys.getwindowsversion()以获取架构?
关于sys.getwindowsversion()
链接http://docs.python.org/library/sys.html#sys.getwindowsversion将我们带到http://msdn.microsoft.com/en-us/library/ms724451%28VS.85%29.aspx,但我没有看到与架构(32位/64位)有关的内容。此外,返回的元组中的平台元素似乎独立于架构。
最后一点说明:我正在寻找一个同时使用Python 2.5和从Windows XP开始的Windows版本的解决方案。
谢谢!
编辑:
相关信息在这里可用
http://msdn.microsoft.com/en-us/library/ms724340%28v=VS.85%29.aspx
但是我如何用Python获取它?
编辑2: 在64位Windows上,使用32位Python解释器:
  • os.environ["PROCESSOR_ARCHITECTURE"]返回
    • 'x86'
  • platform.architecture()返回
    • ('32bit', 'WindowsPE')

你想要知道什么,确切地说?架构的大小还是程序存储的位置? - Bastien Léonard
正如问题标题所述:架构大小和版本。 - Thorfin
这些答案是正确的,解决方案也是正确的,只是如果在64位系统上运行32位程序,Windows会模拟这些数据。因此,winapi会返回错误的版本给你。 - evilpie
我正在寻找正确的答案,而不考虑Python解释器的目标架构。我要寻找的是操作系统架构。 - Thorfin
仅架构子集:https://dev59.com/TWs05IYBdhLWcg3wCNhG 32位 vs 64位子集:https://dev59.com/VnM_5IYBdhLWcg3wXx_Z - Ciro Santilli OurBigBook.com
5个回答

25

我认为平台模块确实是获取此信息的最佳途径。

  >>> import platform
  >>> platform.platform()
  'Windows-7-6.1.7601-SP1'
  platform.processor()
  'Intel64 Family 6 Model 42 Stepping 7, GenuineIntel'

我没有在这里找到有关32/64位Windows的确定答案的地方,所以我建议这样做:

  try:
      os.environ["PROGRAMFILES(X86)"]
      bits = 64
  except:
      bits = 32
  print "Win{0}".format(bits)

或者,如果你需要知道你正在运行哪个版本的Python(因为你可以在x64 Windows下运行x32 Python):

x32 python x64 windows:
>>> platform.architecture()
('32bit', 'WindowsPE')
>>> sys.version
'2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)]'

x64 python x64 windows:
>>> platform.architecture()
('64bit', 'WindowsPE')
>>> sys.version
'2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)]'

1
platform.machine()现在返回32/64位作为i386/AMD64platform.uname()将以单个调用返回操作系统版本和架构。 - Daniel
Python 3.10的platform.machine()函数在Windows 10操作系统中返回x86或者AMD64 - AntonK

6

These variables show your current runtime status on windows:


@rem Test environment using this table:
@rem
@rem Environment Variable       32bit Native    64bit Native    WOW64
@rem PROCESSOR_ARCHITECTURE     x86             AMD64           x86
@rem PROCESSOR_ARCHITEW6432     undefined       undefined       AMD64
@rem


1
听起来不错!您知道用户是否可以更改这些环境变量(甚至是无意识的)吗? - Thorfin

2
另一个选项(轮询 WMI 获取 OsArchitecture):
如果您安装了 pywin32python wmi 模块,您应该能够执行此操作(但仅适用于 Windows Vista 及更高版本!):
import wmi
c = wmi.WMI()
for os in c.Win32_OperatingSystem():
    print os.osarchitecture

或者,您也可以使用_winreg 模块检查在HKEY_LOCAL_MACHINE下是否存在SOFTWARE\Wow6432Node(这只有在64位操作系统版本上才存在)(无外部依赖项)。

1
很遗憾,pywin32不支持Python 2.5和amd64架构。 http://sourceforge.net/projects/pywin32/files/ - Thorfin
好的,我添加了另一個選項(2) - 未經測試,因為我周圍沒有64位元的Windows操作系統。 - ChristopheD
谢谢Christophe,这确实可以工作!但我更喜欢Luke的解决方案,因为我不必导入一个特定于Windows的模块。 - Thorfin

1
我希望这可以解决问题。我在我的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位,则会打印AMD32。

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


这与获取环境变量相同。唯一的区别是它不受SET命令的影响。 - ivan_pozdeev

0

这是一个不错的 Python 命令行代码。

>python -c "import platform as p; print(p.platform());print(p.processor())"
Windows-10-10.0.17134-SP0
Intel64 Family 6 Model 61 Stepping 4, GenuineIntel

>

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