Определить, что на пи

23

У меня есть сценарий Python, который использует sys.platform.startswith ('linux'), чтобы проверить, работает ли он на Linux или нет, но тогда я не могу определить разницу между процессором x86 / 64 и ARM Raspberry Pi процессор.

Причина, по которой мне это нужно, состоит в том, чтобы запустить внешний скрипт, скомпилированный для mac, linux x86 / 64 или linux ARM для raspberry pi.

Из того, что я могу сказать, на самом деле нет единого способа сказать, что вы на самом деле работаете на малиновом пи. Любая помощь будет оценена.

jnesselr
источник
1
Можете ли вы использовать os.uname () для получения этой информации?
milancurcic
Будет ли это работать на всех дистрибутивах для Raspberry Pi? На распбиан хрипит, похоже, работает.
jnesselr

Ответы:

12

Вы можете использовать osмодуль Python для получения этой информации через uname:

import os
os.uname()

Эта функция должна предоставлять платформу и другую информацию о большинстве Linux или Unix-подобных дистрибутивов.

Из документации Python:

os.uname ()

Возвращает 5-кортеж, содержащий информацию, идентифицирующую текущую операционную систему. Кортеж содержит пять строк: (sysname, nodename, release, version, machine). Некоторые системы усекают имя узла до восьми символов или до ведущего компонента; лучший способ получить имя хоста socket.gethostname()или даже socket.gethostbyaddr(socket.gethostname()).

Доступность: последние версии Unix.

milancurcic
источник
2
os.uname()[4][:3] == 'arm'
OrangeTux
2
Любой, кто смотрит на это сейчас, в конечном итоге мы сделали os.uname () [4] .startsWith ("arm") для проверки.
jnesselr
2
@jnesselr крошечная опечатка, это startswithне так startsWith. Спасибо, это помогло.
Nishant
5

Я нашел, что вы можете получить модель и версию Pi от:

/ SYS / прошивки / devicetree / база / модель

Пример: Raspberry Pi 3 Model B Rev 1.2

У меня есть сценарий оболочки, чтобы найти это и вернуть содержимое, если оно существует. Вызов ОС для чтения файла, если он существует, должен вас правильно настроить. Посылка, если она не существует, это определенно не RPi. Если это так, то проверьте содержимое, чтобы быть уверенным.

Уэсли Мейсон
источник
3

Это скорее проблема с появлением Pi 2 (который не так просто отличить от Beaglebone Black). Наивысший уровень детализации находится в / proc / cpuinfo для систем на основе Linux (строка «Оборудование»). Вот пример анализа этого из кода Adafruit GPIO:

https://github.com/adafruit/Adafruit_Python_GPIO/blob/master/Adafruit_GPIO/Platform.py

MartyMacGyver
источник
1
Это звучит как лучший ответ для меня, так как я бы предложил тестирование / proc / cpuinfo. Я никогда раньше не видел platform.py от adafruit, но, глядя на него, это имеет смысл. Также, если файл не существует, вы будете знать, что это не система на основе Linux. Спасибо за это :). Есть мой +1.
Питер
Я столкнулся с этим вчера, когда пытался заставить py-gaugette работать с моим Pi2 ... он (в настоящее время) использует метод модуля платформы, который, к сожалению, не работает с Pi2, и, будем надеяться, также выиграет от этого. github.com/guyc/py-gaugette/issues/12
MartyMacGyver
3

Лучшая широко применяемая система идентификации информации, которую я нашел, была с:

platform._syscmd_uname('-a')

Похоже, это дает тот же вывод, что и команда оболочки uname -a. В большинстве случаев возвращаемый результат по существу такой же (строка вместо 5-кортежа), как и у os.uname().

Те, что я протестировал и нашел эквивалентные результаты, это OSX 10.9.5, Ubuntu 14.04 и Raspbian (??) Wheezy. Однако на NAS-устройстве Synology я получаю больше информации из 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+'

Видя «синологию» в выходных данных, вы определяете ее как среду, в которой вещи ведут себя неожиданно.

Брок Мендель
источник
1

Лучший способ сделать это ( фрагмент кода 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()
Артур Барсегян
источник
-1

На пи 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
Гжегож Гловацкий
источник
8
'raspberrypi' ваше имя хоста - это не будет работать, если вы измените имя хоста на что-то другое
rhu