![](/img/trans.png)
[英]MacOS M1 system is detected as ARM by Python package even though I'm using Rosetta
[英]How to check if Python is running on an M1 mac, even under Rosetta?
我有启动进程的 python 3.10 代码,但如果它在 M1 Mac 上运行,则需要运行不同的进程。
即使 python 进程正在 Rosetta 中运行,是否有一种方法可以可靠地检测您是否在使用 M1 Mac?
我试过这个:
print(sys.platform)
# On Intel silicon:
darwin
# On M1 silicon:
darwin
但它总是打印“darwin”。
我尝试在 os.* 和 sys.* 库中四处嗅探,我发现的最好的是:
print(os.uname())
# On Intel silicon:
posix.uname_result(sysname='Darwin', nodename='XXX', release='21.5.0', version='Darwin Kernel Version 21.5.0: Tue Apr 26 21:08:22 PDT 2022; root:xnu-8020.121.3~4/RELEASE_X86_64', machine='x86_64')
# On M1 silicon:
posix.uname_result(sysname='Darwin', nodename='XXX', release='21.4.0', version='Darwin Kernel Version 21.4.0: Fri Mar 18 00:47:26 PDT 2022; root:xnu-8020.101.4~15/RELEASE_ARM64_T8101', machine='x86_64')
我假设它在 M1 机器上返回machine= 'x86_64'
因为 Python 在 Rosetta 中运行? version
字段确实出现了不同:
# Intel
version='Darwin Kernel Version 21.5.0: Tue Apr 26 21:08:22 PDT 2022; root:xnu-8020.121.3~4/RELEASE_X86_64'
# M1
version='Darwin Kernel Version 21.4.0: Fri Mar 18 00:47:26 PDT 2022; root:xnu-8020.101.4~15/RELEASE_ARM64_T8101'
如果您在 Rosetta 下运行,解析 uname() 并在版本字段中寻找“ARM”是检查 M1 芯片的最佳方式吗?
使用 Python 内置的platform
库判断 Mac 是否为 M1/M2:
import platform
print(platform.processor())
在 M1/M2 Mac 上 --> arm
在较旧的 Mac 上 --> i386
您可以只检查处理器名称,然后以这种方式检查。 获取它的最简单方法是使用cpuinfo
模块。 cpuinfo.get_cpu_info()['brand_raw']
返回带有处理器品牌和名称的字符串,例如“Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz”。 如果你只想拥有“i5-6500”,你可以从字符串中取出第三个单词。
import cpuinfo
cpudata = cpuinfo.get_cpu_info()['brand_raw']
cpuname = cpudata.split(" ")[1]
如果你然后会print(cpuname)
,它应该只输出处理器“名称”,所以在这种情况下是 i5-6500。
我能够从 Python 做到这一点的唯一方法是调用sysctl
。 这取自cmake-macos-rosetta :
M1 上的非 Rosetta Python:
>>> import platform, subprocess
>>> platform.processor()
'arm'
# Rosetta would not report arm.
>>> subprocess.run(["sysctl", "-n", "sysctl.proc_translated"])
0
M1 上的 Rosetta Python:
>>> import platform, subprocess
>>> platform.processor()
'i386'
# Rosetta fakes the processor.
>>> subprocess.run(["sysctl", "-n", "sysctl.proc_translated"])
1
CompletedProcess(args=['sysctl', '-n', 'sysctl.proc_translated'], returncode=0)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.