Python 的“platform.mac_ver()”报告不正确的 MacOS 版本

Ami*_*ert 0 python macos

我正在使用 Pythonplatform模块来识别 MacOS 版本,如下所示:

import platform
print(platform.mac_ver())
Run Code Online (Sandbox Code Playgroud)

输出:

In [1]: import platform

In [2]: platform.mac_ver()
Out[2]: ('10.16', ('', '', ''), 'x86_64')
Run Code Online (Sandbox Code Playgroud)

我已经更新到BigSur,版本不对,应该是11.0.1

在此处输入图片说明

我查看了平台的源代码,它似乎解析了一个这个文件/System/Library/CoreServices/SystemVersion.plist来获取信息。从 Python 读取此文件时,我得到了一个不正确的版本,但从 bash 中它是正确的

重击:

import platform
print(platform.mac_ver())
Run Code Online (Sandbox Code Playgroud)

Python:

In [1]: import platform

In [2]: platform.mac_ver()
Out[2]: ('10.16', ('', '', ''), 'x86_64')
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

这是同一ipython会话的输出

Amirs-MacBook-Pro:~ arossert$ cat /System/Library/CoreServices/SystemVersion.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>ProductBuildVersion</key>
    <string>20B50</string>
    <key>ProductCopyright</key>
    <string>1983-2020 Apple Inc.</string>
    <key>ProductName</key>
    <string>macOS</string>
    <key>ProductUserVisibleVersion</key>
    <string>11.0.1</string>
    <key>ProductVersion</key>
    <string>11.0.1</string>
    <key>iOSSupportVersion</key>
    <string>14.2</string>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

Cha*_*ffy 5

在 Big Sur 发行说明的已知问题部分,存在以下内容:

由于 macOS 版本从 10.x 更改为 11,某些第三方脚本可能会产生意外结果。 (62477208)

解决方法:在调用环境中设置SYSTEM_VERSION_COMPAT=1,例如:$SYSTEM_VERSION_COMPAT=1 legacy_script.pl

https://eclecticlight.co/2020/08/13/macos-version-numbering-isnt-so-simple/ 上还有一个相当广泛的 3rd-party 文章


为 Big Sur 编译的应用程序返回“11.0”作为操作系统版本。

为早期版本编译的应用程序获得“10.16”。这是假设 10 作为前缀不会中断的逻辑。

环境变量SYSTEM_VERSION_COMPAT可用于控制返回的文件版本;SYSTEM_VERSION_COMPAT=0 cat /System/Library/CoreServices/SystemVersion.plist返回11.0.1,而SYSTEM_VERSION_COMPAT=1 cat /System/Library/CoreServices/SystemVersion.plist返回10.16。(请注意,赋值和调用之间应该有一个空格,而不是换行符,cat这样 shell 会将其视为临时环境变量赋值,而不是非导出 shell 变量的赋值)。