Wykryj, że na pi działa program python

23

Mam skrypt w języku Python, który używa sys.platform.startswith („linux”) do testowania, czy działa na Linuksie, czy nie, ale nie mogę odróżnić procesora x86 / 64 od ARM raspberry pi edytor.

Powodem, dla którego tego potrzebuję, jest uruchomienie zewnętrznego skryptu skompilowanego dla systemu Mac, Linux x86 / 64 lub Linux ARM dla Raspberry Pi.

Z tego, co mogę powiedzieć, tak naprawdę nie ma jednolitego sposobu na stwierdzenie, że tak naprawdę używasz malinowego pi. Każda pomoc będzie mile widziana.

jnesselr
źródło
1
Czy możesz użyć os.uname (), aby uzyskać te informacje?
milancurcic
Czy to zadziała na wszystkich dystrybucjach dla Raspberry Pi? Na raspbian wheezy wydaje się, że działa.
jnesselr

Odpowiedzi:

12

Możesz użyć osmodułu Pythona, aby uzyskać te informacje poprzez uname:

import os
os.uname()

Ta funkcja powinna dostarczać informacje o platformie i inne informacje o większości dystrybucji podobnych do Linuksa lub Uniksa.

Z dokumentacji Python:

os.uname ()

Zwraca 5-krotną zawierającą informacje identyfikujące bieżący system operacyjny. Krotka zawiera pięć ciągów: (nazwa_systemu, nazwa_węzła, wydanie, wersja, maszyna). Niektóre systemy skracają nazwę węzła do ośmiu znaków lub do wiodącego komponentu; lepszym sposobem na uzyskanie nazwy hosta jest socket.gethostname()lub nawet socket.gethostbyaddr(socket.gethostname()).

Dostępność: najnowsze smaki Uniksa.

milancurcic
źródło
2
os.uname()[4][:3] == 'arm'
OrangeTux,
2
Każdy, kto na to teraz patrzy, skończyło się na os.uname () [4] .startsWith („arm”), by to sprawdzić.
jnesselr
2
@jnesselr malutka literówka, to startswithnie jest startsWith. Dzięki, pomogło.
Nishant
5

Odkryłem, że możesz pobrać model Pi i wersję z:

/ sys / firmware / devicetree / base / model

Np .: Raspberry Pi 3 Model B Rev 1.2

Mam skrypt powłoki, aby tego szukać i zwracać zawartość, jeśli istnieje. Wywołanie systemu operacyjnego w celu odczytania pliku, jeśli istnieje, powinno cię odpowiednio ustawić. Założeniem jest, jeśli nie istnieje, to zdecydowanie nie jest RPi. Jeśli tak, sprawdź zawartość, aby się upewnić.

Wesley Mason
źródło
3

Jest to bardziej problem z pojawieniem się Pi 2 (które nie jest łatwe do odróżnienia od Beaglebone Black). Najwyższy poziom szczegółowości znajduje się w / proc / cpuinfo w systemach Linux (linia „Sprzęt”). Oto przykład analizy, który pochodzi z kodu GPIO Adafruit:

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

MartyMacGyver
źródło
1
To brzmi jak najlepsza odpowiedź, ponieważ sugerowałbym przetestowanie / proc / cpuinfo. Nigdy wcześniej nie widziałem platformy.py od adafruita, ale patrząc na to, ma to sens. Również jeśli plik nie istnieje, będziesz wiedział, że nie jest to system oparty na systemie Linux. Dzięki za to :). Mam moje +1.
Peter
Zetknąłem się z tym wczoraj, gdy próbowałem uruchomić py-gaugette z moim Pi2 ... (obecnie) używa metody modułu platformy, która niestety zawodzi z Pi2 i mam nadzieję, że również z tego skorzysta. github.com/guyc/py-gaugette/issues/12
MartyMacGyver
3

Najlepsze powszechnie stosowane informacje identyfikujące system to:

platform._syscmd_uname('-a')

Wydaje się, że daje to samo wyjście, co polecenie powłoki uname -a. W większości przypadków zwracane dane wyjściowe są zasadniczo takie same (ciąg zamiast 5 krotek) jak w przypadku os.uname().

Te, które przetestowałem i znalazłem równoważne wyjścia to OSX 10.9.5, Ubuntu 14.04 i Raspbian (??) Wheezy. Jednak na serwerze Synology NAS otrzymuję więcej informacji z platform._syscmd_uname('-a')wersji:

>>> 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+'

Widzenie „synologii” na wyjściu oznacza, że ​​jest to środowisko, w którym rzeczy zachowują się nieoczekiwanie.

Brock Mendel
źródło
1

Lepszy sposób na zrobienie tego ( fragment kodu w języku 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()
Artur Barseghyan
źródło
-1

Na PI 3

import os    
os.uname()[1] == 'raspberrypi'

Dlatego:

uname -a
Linux raspberrypi 4.4.50-v7+ #970 SMP Mon Feb 20 19:18:29 GMT 2017 armv7l GNU/Linux
Grzegorz Głowacki
źródło
8
'raspberrypi' twoja
nazwa