簡體   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