![](/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.