我有一个使用sys.platform.startswith('linux')的python脚本来测试它是否在linux上,但是然后我无法分辨x86 / 64处理器和raspberry pi的ARM之间的区别。处理器。

我需要这样做的原因是,运行为树莓派针对mac,linux x86 / 64或linux ARM编译的外部脚本。

来自我可以说的是,实际上并没有一种统一的方法可以告诉您实际上是在树莓派上运行。任何帮助将不胜感激。

评论

您可以使用os.uname()获取此信息吗?

可以在树莓派的所有发行版中使用吗?在覆盆子喘息的情况下,它似乎有效。

#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