Stellen Sie fest, dass auf dem Pi ein Python-Programm ausgeführt wird

23

Ich habe ein Python-Skript, das sys.platform.startswith ('linux') verwendet, um zu testen, ob es unter Linux läuft oder nicht, aber dann kann ich den Unterschied zwischen dem x86 / 64-Prozessor und dem Himbeer-Pi-ARM nicht erkennen Prozessor.

Der Grund, warum ich das brauche, ist, ein externes Skript auszuführen, das entweder für Mac, Linux x86 / 64 oder Linux ARM für das Himbeer-Pi kompiliert wurde.

Nach allem, was ich sagen kann, gibt es keine einheitliche Methode, um zu sagen, dass Sie tatsächlich auf einem Himbeer-Pi laufen. Jede Hilfe wäre dankbar.

jnesselr
quelle
1
Können Sie os.uname () verwenden, um diese Informationen zu erhalten?
milancurcic
Funktioniert das auf allen Distributionen für Himbeer-Pi? Bei Raspbian Wheezy scheint es zu funktionieren.
Jnesselr

Antworten:

12

Sie können das Python- osModul verwenden, um diese Informationen zu erhalten uname:

import os
os.uname()

Diese Funktion sollte Plattform- und andere Informationen zu den meisten Linux- oder Unix-ähnlichen Distributionen bereitstellen.

Aus der Python-Dokumentation:

os.uname ()

Geben Sie ein 5-Tupel zurück, das Informationen zum aktuellen Betriebssystem enthält. Das Tupel enthält fünf Zeichenfolgen: (sysname, knotenname, release, version, machine). Einige Systeme kürzen den Knotennamen auf acht Zeichen oder auf die führende Komponente. Ein besserer Weg, um den Hostnamen zu bekommen, ist socket.gethostname()oder sogar socket.gethostbyaddr(socket.gethostname()).

Verfügbarkeit: Neueste Versionen von Unix.

milancurcic
quelle
2
os.uname()[4][:3] == 'arm'
OrangeTux
2
Jeder, der sich das jetzt ansieht, hat am Ende os.uname () [4] .startsWith ("arm") zum Überprüfen ausgeführt.
Jnesselr
2
@ Jnesselr winziger Tippfehler ist es startswithnicht startsWith. Danke, es hat geholfen.
Nishant
5

Ich fand, dass Sie das Pi-Modell und die Version von erhalten können:

/ sys / firmware / devicetree / base / model

Beispiel: Raspberry Pi 3 Model B Rev. 1.2

Ich habe ein Shell-Skript, um danach zu suchen und den Inhalt zurückzugeben, falls er existiert. Ein OS-Aufruf zum Lesen der Datei, falls vorhanden, sollte Sie in Ordnung bringen. Die Prämisse ist, wenn es nicht existiert, ist es definitiv kein RPi. Ist dies der Fall, überprüfen Sie den Inhalt, um sicherzugehen.

Wesley Mason
quelle
3

Dies ist eher ein Problem mit dem Aufkommen des Pi 2 (das nicht einfach vom Beaglebone Black zu unterscheiden ist). Die höchste Detailstufe finden Sie in / proc / cpuinfo auf Linux-basierten Systemen (die 'Hardware'-Zeile). Hier ist ein Beispiel für das Parsen aus dem Adafruit-GPIO-Code:

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

MartyMacGyver
quelle
1
Das klingt für mich nach der besten Antwort, da ich vorgeschlagen hätte, / proc / cpuinfo zu testen. Ich habe das platform.py noch nie von adafruit gesehen, aber wenn ich es mir anschaue, ergibt es Sinn. Auch wenn die Datei nicht existiert, wissen Sie, dass es sich nicht um ein Linux-basiertes System handelt. Danke dafür :). Habe meine +1.
Peter
Ich bin gestern darauf gestoßen, als ich versucht habe, py-gaugette mit meinem Pi2 zum Laufen zu bringen ... es verwendet (derzeit) die Plattformmodulmethode, die beim Pi2 leider nicht funktioniert, und wird hoffentlich auch davon profitieren. github.com/guyc/py-gaugette/issues/12
MartyMacGyver
3

Die besten allgemein anwendbaren systemidentifizierenden Informationen, die ich gefunden habe, waren:

platform._syscmd_uname('-a')

Dies scheint die gleiche Ausgabe wie der Shell-Befehl zu liefern uname -a. In den meisten Fällen ist die zurückgegebene Ausgabe im Wesentlichen dieselbe (ein String anstelle eines 5-Tupels) wie die vonos.uname() .

Diejenigen, die ich getestet habe und die entsprechende Ausgabe gefunden habe, sind OSX 10.9.5, Ubuntu 14.04 und Raspbian (??) Wheezy. Auf einem Synology NAS erhalte ich jedoch weitere Informationen aus der platform._syscmd_uname('-a')Version:

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

Wenn Sie "Synology" in der Ausgabe sehen, ist dies eine Umgebung, in der sich Dinge unerwartet verhalten.

Brock Mendel
quelle
0

Auf PI 3

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

Weil:

uname -a
Linux raspberrypi 4.4.50-v7+ #970 SMP Mon Feb 20 19:18:29 GMT 2017 armv7l GNU/Linux
Grzegorz Głowacki
quelle
7
'raspberrypi' deines Hostnamens - dies funktioniert nicht, wenn du den Hostnamen in etwas anderes
änderst
0

Bessere Vorgehensweise (Python- Code-Snippet ):

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
quelle