检测pi上是否正在运行python程序


23

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

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

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


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

可以在树莓派的所有发行版中使用吗?对于树莓般的喘息,它似乎起作用。
jnesselr

Answers:


12

您可以使用Python的os模块通过uname以下方式获取此信息:

import os
os.uname()

此功能应在大多数Linux或类Unix发行版中提供平台和其他信息。

从Python文档中:

os.uname()

返回一个5元组,其中包含标识当前操作系统的信息。元组包含五个字符串:(系统名称,节点名称,发行版,版本,计算机)。某些系统将节点名截断为八个字符或开头部分。获取主机名的更好方法是socket.gethostname()甚至socket.gethostbyaddr(socket.gethostname())

可用性:Unix的最新版本。


2
os.uname()[4][:3] == 'arm'
OrangeTux

2
现在看这个的任何人,我们最终都要执行os.uname()[4] .startsWith(“ arm”)进行检查。
jnesselr 2014年

2
@jnesselr很小的错字startswith,不是startsWith。谢谢,它有所帮助。
Nishant 2014年

5

我发现您可以从以下位置获得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


1
这听起来对我来说是最好的答案,因为我建议测试/ proc / cpuinfo。我以前从没看过adafruit的platform.py,但是仔细看,这很有意义。另外,如果该文件不存在,您将知道它不是基于Linux的系统。谢谢你:)。有我的+1。
彼得

昨天,我在尝试让py-gaugette与Pi2配合使用时遇到了这个问题……(目前)使用的平台模块方法很不幸在Pi2上失败了,希望也能从中受益。github.com/guyc/py-gaugette/issues/12
MartyMacGyver,2015年

3

我发现的最广泛使用的系统识别信息是:

platform._syscmd_uname('-a')

这似乎提供与shell命令相同的输出uname -a。在大多数情况下,返回的输出与的本质上是相同的(字符串而不是5元组)os.uname()

我测试并发现等效输出的是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”,将其标识为事物表现异常的环境。


0

在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

7
'raspberrypi'您的主机名-如果您将主机名更改为其他名称,则该命令将不起作用
rhu

0

更好的方法(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',
                        '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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.