繁体   English   中英

如何检查 Python 是否在 M1 mac 上运行,甚至在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM