Python platform.architecture()为何返回WindowsPE错误值?
自Windows 10系统起,Python内置的platform.architecture()函数返回的Windows架构值存在异常:按预期应识别为AMD64架构,但实际返回结果包含WindowsPE,该返回值属于错误结果。
Windows PE(WinPE)是一款小型操作系统,仅用于安装、部署和修复Windows桌面版、Windows Server以及其他Windows操作系统,不会作为日常使用的主系统运行。
启动Python时显示的环境信息如下:
Python 3.7.9 (tags/v3.7.9:13c94747c7, Aug 17 2020, 18:58:18) [MSC v.1900 64 bit (AMD64)] on win32
执行如下Python命令后得到对应返回结果:
import platform platform.architecture() ('64bit', 'WindowsPE')
这个误报是platform.architecture()函数的已知兼容缺陷,和实际运行环境无关。该函数的判断逻辑长期未更新,是通过读取当前进程的PE文件头标识来判定系统类型,Windows 10及后续版本调整了系统二进制文件的PE兼容标识后,旧判断规则无法正确区分普通桌面Windows和WinPE环境,才会返回错误结果。从Python启动时打印的环境信息就能确认,当前实际运行在64位AMD64架构的普通Windows系统上,并不存在处于WinPE环境的情况。
不要依赖platform.architecture()返回的第二个值判断Windows环境类型,获取准确的系统信息可以用以下可靠方式:
- 调用
platform.machine()获取准确的硬件架构标识,AMD64架构的设备会正确返回AMD64 - 通过
sys.maxsize判断系统位数:当sys.maxsize > 2**32时为64位系统,否则为32位系统 - 如果需要确认当前是否真的运行在WinPE环境中,需要读取系统注册表的对应配置项判定,不能直接使用
platform库的过时逻辑
正确获取系统信息的参考代码:
import sys import platform cpu_arch = platform.machine() sys_bit = "64bit" if sys.maxsize > 2 ** 32 else "32bit" print(f"硬件架构:{cpu_arch},系统位数:{sys_bit}")
上述代码在普通64位Windows桌面系统上运行时,会正确返回AMD64架构、64位系统的结果,不会再出现WinPE的误报。
内容的提问来源于stack exchange,提问作者Colin Helms

