Визначте, що програма pithon працює на pi


23

У мене є сценарій python, який використовує sys.platform.startswith ('linux') для перевірки, чи є він у Linux чи ні, але тоді я не можу визначити різницю між процесором x86 / 64 та ARM малинового пі процесор.

Причиною, що мені це потрібно, є запуск зовнішнього скрипту, складеного для mac, linux x86 / 64, або linux ARM для малинового pi.

З того, що я можу сказати, насправді не існує єдиного способу сказати, що ти насправді працюєш на малиновому пі. Будь-яка допомога буде вдячна.


1
Чи можете ви використовувати os.uname () для отримання цієї інформації?
milancurcic

Це буде працювати на всіх дистрибутивах для малинових пі? На розп’янському хрипі, здається, працює.
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.


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

2
Кожен, хто дивиться на це зараз, ми в кінцевому підсумку робимо os.uname () [4] .startsWith ("рука") для перевірки.
jnesselr

2
@jnesselr крихітна помилка, це startswithне так startsWith. Дякую, це допомогло.
Нішант

5

Я виявив, що ви можете отримати модель та версію Pi від:

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

Наприклад: Raspberry Pi 3 Model B Rev 1.2

У мене є сценарій оболонки, щоб шукати це і повертати вміст, якщо він існує. Виклик ОС для читання файлу, якщо він існує, повинен встановити вас правильно. Приміщення - якщо його не існує, воно точно не є RPI. Якщо це так, то перевірте вміст, щоб переконатися.


3

Це більше проблема з появою Pi 2 (який не просто відрізнити від Біглбон Чорного). Найвищий рівень деталізації виявляється в / proc / cpuinfo в системах на базі Linux (рядок "Обладнання"). Ось приклад розбору цього коду з GPIO-коду Adafruit:

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


1
Це звучить як найкраща відповідь для мене, оскільки я б запропонував тестувати / proc / cpuinfo. Я ніколи не бачив platform.py від adafruit раніше, але переглядаючи його, це має сенс. Крім того, якщо файл не існує, ви знаєте, що це не Linux-система. Дякую за це :). У мене є +1.
Петро

Я зіткнувся з цим вчора, коли намагався змусити py-gaugette працювати з моїм Pi2 ... він (на даний момент) використовує метод модуля платформи, який, на жаль, не працює з Pi2, і, сподіваємось, виграє і від цього. github.com/guyc/py-gaugette/isissue/12
MartyMacGyver

3

Найкраща широко застосовною до мене система виявлення інформації була з:

platform._syscmd_uname('-a')

Здається, це дає такий же вихід, як і команда оболонки 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+'

Бачачи «синологію» у висновку там, він ідентифікує це як середовище, де речі поводяться несподівано.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.