我需要这样做的原因是,运行为树莓派针对mac,linux x86 / 64或linux ARM编译的外部脚本。
来自我可以说的是,实际上并没有一种统一的方法可以告诉您实际上是在树莓派上运行。任何帮助将不胜感激。
#1 楼
您可以使用Python的os
模块通过uname
获取此信息:import os
os.uname()
此函数应提供有关大多数Linux或类Unix发行版的平台和其他信息。
来自Python文档:
os.uname()
返回一个5元组,其中包含标识当前操作系统的信息。元组包含五个字符串:(系统名称,节点名称,发行版,版本,计算机)。某些系统将节点名截断为八个字符或开头部分。获取主机名的更好方法是
socket.gethostname()
甚至socket.gethostbyaddr(socket.gethostname())
。可用性:Unix的最新版本。
评论
os.uname()[4] [:3] =='手臂'
– OrangeTux
13年7月6日在13:09
现在看这个的任何人,我们最终都要执行os.uname()[4] .startsWith(“ arm”)进行检查。
– jnesselr
2014年1月26日7:27
@jnesselr微小的错字,它是startswith,而不是startsWith。谢谢,它有所帮助。
– Nishant
2014年10月4日在9:49
并非每台基于ARM的计算机都是Raspberry Pi。
–scai
1月2日20:15
#2 楼
我发现您可以从以下位置获得Pi模型和版本:/ sys / firmware / devicetree / base / model
例如:Raspberry Pi 3 Model B Rev 1.2
我有一个shell脚本来查找并返回内容(如果存在)。操作系统调用以读取文件(如果存在)应该设置正确。前提是,如果不存在,则绝对不是RPi。如果是这样,请检查内容以确保内容。
#3 楼
Pi 2的问世(这与Beaglebone Black的区别并不容易)更是一个问题。在基于Linux的系统上的/ proc / cpuinfo中(“硬件”行)可以找到最高级别的详细信息。这是一个解析示例,来自Adafruit GPIO代码:https://github.com/adafruit/Adafruit_Python_GPIO/blob/master/Adafruit_GPIO/Platform.py
评论
这听起来对我来说是最好的答案,因为我建议测试/ proc / cpuinfo。我以前从未看过adafruit的platform.py,但是仔细看,这是有道理的。另外,如果该文件不存在,您将知道它不是基于Linux的系统。谢谢你:)。有我的+1。
–彼得
2015年2月18日在4:35
昨天,我在尝试使py-gaugette与Pi2配合使用时遇到了此问题……(当前)使用的平台模块方法不幸地在Pi2上失败了,希望也能从中受益。 github.com/guyc/py-gaugette/issues/12
–MartyMacGyver
15年2月18日在7:30
#4 楼
我发现的最广泛应用的最佳系统识别信息是:platform._syscmd_uname('-a')
这似乎提供与shell命令
uname -a
相同的输出。在大多数情况下,返回的输出与os.uname()
基本相同(字符串而不是5元组)。我测试过的结果发现等效输出为OSX 10.9.5,Ubuntu 14.04和Raspbian(??)Wheezy。不过,在Synology NAS上,我从
platform._syscmd_uname('-a')
版本中获得了更多信息:>>> os.uname()
('Linux', [hostname], '3.10.35', [...], 'x86_64')
>>> platform._syscmd_uname('-a')
'Linux [hostname] 3.10.35 [...] x86_64 GNU/Linux synology_cedarview_1813+'
看到输出中的“ synology”,将其识别为异常情况的环境。
#5 楼
platform.machine()
将返回:在32位Raspbian上运行的Raspberry Pi上的armv7l
。在所有Arm 64位OS上(包括在Amazon AWS中运行的OS)上的aarch64
Graviton2。因此,如果您的程序是为Arm编写的,而不是专门为Raspberry Pi编写的,则这是检测Arm的更可靠的方法。
#6 楼
更好的方法(Python代码段):import io
def is_raspberry_pi(raise_on_errors=False):
"""Checks if Raspberry PI.
:return:
"""
try:
with io.open('/proc/cpuinfo', 'r') as cpuinfo:
found = False
for line in cpuinfo:
if line.startswith('Hardware'):
found = True
label, value = line.strip().split(':', 1)
value = value.strip()
if value not in (
'BCM2708',
'BCM2709',
'BCM2711',
'BCM2835',
'BCM2836'
):
if raise_on_errors:
raise ValueError(
'This system does not appear to be a '
'Raspberry Pi.'
)
else:
return False
if not found:
if raise_on_errors:
raise ValueError(
'Unable to determine if this system is a Raspberry Pi.'
)
else:
return False
except IOError:
if raise_on_errors:
raise ValueError('Unable to open `/proc/cpuinfo`.')
else:
return False
return True
IS_RASPBERRY_PI = is_raspberry_pi()
评论
为什么不使用cat / sys / firmware / devicetree / base / model;读取Raspberry Pi模型;回显一下,省去很多麻烦。您可以使用两行python代码来做到这一点。
–道奇
20-11-19在22:17
@Dougie您可以共享这两行python代码吗?我在一个跨平台解决方案的答案中尽可能地浓缩了这个答案,但是如果有更短的路线,我会选择的。
–克里斯
20-11-20在23:05
#!/ usr / bin / python3,以open('/ sys / firmware / devicetree / base / model')作为模型:RPi_model = model.read()打印(RPi_model)
–道奇
20-11-20在23:17
谢谢@Dougie。用您的解决方案更新了我的答案。
–克里斯
20-11-20在23:57
#7 楼
这是@Artur Barseghyan的答案的简化版本。import io
import os
def is_raspberrypi():
if os.name != 'posix':
return False
chips = ('BCM2708','BCM2709','BCM2711','BCM2835','BCM2836')
try:
with io.open('/proc/cpuinfo', 'r') as cpuinfo:
for line in cpuinfo:
if line.startswith('Hardware'):
_, value = line.strip().split(':', 1)
value = value.strip()
if value in chips:
return True
except Exception:
pass
return False
,或者@Dougie建议的更精简的解决方案,而无需维护芯片组的更新列表。
def is_raspberrypi():
try:
with io.open('/sys/firmware/devicetree/base/model', 'r') as m:
if 'raspberry pi' in m.read().lower(): return True
except Exception: pass
return False
#8 楼
在PI 3上import os
os.uname()[1] == 'raspberrypi'
因为:
uname -a
Linux raspberrypi 4.4.50-v7+ #970 SMP Mon Feb 20 19:18:29 GMT 2017 armv7l GNU/Linux
评论
'raspberrypi'您的主机名-如果您将主机名更改为其他名称,则此操作将无效
–rhu
17年7月19日在16:08
评论
您可以使用os.uname()获取此信息吗?可以在树莓派的所有发行版中使用吗?在覆盆子喘息的情况下,它似乎有效。