【问题标题】:Why is python giving the wrong windows version?为什么 python 给出错误的 windows 版本?
【发布时间】:2017-08-19 19:54:52
【问题描述】:

我想要一个程序来确定计算机上正在运行的操作系统及其版本。 当platform.release() 返回“8”时,我真的很困惑,因为我的计算机最初运行在 Windows 8 上,但几个月前我在 Windows 10 上进行了更新。

我的猜测是这更像是一个 windows 问题而不是 python 问题。 有没有办法解决这个问题?还是应该使用与platform 不同的模块?

我正在使用 python 3.4.3。 platform.platform() 返回的整个版本名称是“Windows-8-6.2.9200”,但我不知道它是计算机上的第一个版本还是更新前的最后一个版本。

【问题讨论】:

  • 3.4.4 python 在我的 Windows 10 盒子上返回“10”,并返回“Windows-10-10.0.14393”(release())
  • 嗯,你能解释一下为什么我的回答是错误的吗? sys.platform 不工作吗?
  • @Jean-François Fabre:你有哪个版本的platform.py文件?
  • python 3.4.4 是 1.0.7
  • 我也有 1.0.7。我不确定,但从第 589 行开始,有一些 if 语句,最后一个确定 8。10 什么都没有。

标签: python windows


【解决方案1】:

来自Python Changelog Documentation 3.4.4-release-candidate-1

bpo-19143:平台模块现在从 kernel32.dll 读取 Windows 版本 以避免兼容性垫片。

修复了referenced bug:

Python 在 Windows 8.1 下返回不正确的版本信息。 ... 它 似乎 MS 正在“弃用”GetVersionEx()

引用StackOverflow question

【讨论】:

    【解决方案2】:
    import platform
    platform.platform()
    

    这给了我数字 10,我假设因为我正在运行 Windows 10。

    platform.system()
    

    返回窗口。

    【讨论】:

    • 谢谢,但我以同样的方式做,只是结果错误 8
    【解决方案3】:

    Windows 10 正是因为这个问题而臭名昭著,很难通过以前已知的 API 检测到真​​正的 Windows 版本。长话短说(对不起,如果这听起来不像是一个“质量”的答案),一个人需要OS compatibility element in the app manifest,或者是骇人听闻的黑客攻击。先前已知的 API(GetVersionEx、VerifyVersionInfo)声明已弃用。因此,Python 解释器得到什么,很可能取决于它是否使用合适的清单构建。

    最近的 Python 可执行文件在清单中列出了 Win10(是的,我已经检查过,在 v. 3.6.1 上),因此它们可以以正常方式获得正确的 Win10 版本......直到微软再次打破它。

    【讨论】:

    • 您所说的向后兼容行为是在 Windows 8.1 中引入的。不需要“令人震惊的黑客”;有一个documented solution。 Python现在应该在做正确的事,而且它似乎对 Jean 有效。
    • @HarryJohnston - 您的“文档化解决方案”链接(版本帮助程序)基于现已宣布弃用的 API。如果没有适当的清单,“版本助手”将无法工作。最近构建的 Python 可执行文件(例如 3.6.1)具有与 Win10 兼容的清单(还有其他原因 - 支持长路径)。但是如果有人出于某种原因必须在 Win10 上运行旧的可执行文件 - 对不起,不走运。
    • 引用我的链接:“要获取操作系统的完整版本号,请在系统 DLL 之一(例如 Kernel32.dll)上调用 GetFileVersionInfo 函数,然后调用 VerQueryValue 以获取 \\ StringFileInfo\\\\ProductVersion 文件版本信息的子块。"这是正确的解决方案,不依赖于清单和Python does indeed use it。问题只是 OP 使用的是严重过时的 Python 版本。
    • 对此我完全同意。 OP 可能正在使用没有正确清单的旧二进制文件。读取 kernel32.dll 的版本是一种令人震惊的黑客行为。在 MSDN 上看到这样的建议令人震惊,但与现在的其他困境相比,这是无稽之谈。
    • 从 kernel32.dll 读取版本号不是黑客,决定使唯一支持的方法(用于记录目的,几乎是您需要实际版本号的唯一情况)是相当刻意。我不知道它是否会起作用,即说服程序员使用辅助函数而不是继续编写自己的损坏版本号检查,但这不是无偿或粗心做的事情。
    猜你喜欢
    • 1970-01-01
    • 2021-06-28
    • 2017-06-29
    • 2011-10-27
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    相关资源
    最近更新 更多