Détecter qu'un programme python s'exécute sur le pi


23

J'ai un script python qui utilise sys.platform.startswith ('linux') pour tester s'il est sur linux ou non, mais je ne peux pas faire la différence entre le processeur x86 / 64 et l'ARM du Raspberry Pi processeur.

La raison pour laquelle j'ai besoin de cela, c'est d'exécuter un script externe compilé pour mac, linux x86 / 64 ou linux ARM pour le raspberry pi.

D'après ce que je peux dire, il n'y a pas vraiment de façon unifiée de dire que vous courez en fait sur un Raspberry Pi. Toute aide serait appréciée.


1
Pouvez-vous utiliser os.uname () pour obtenir ces informations?
milancurcic

Est-ce que cela fonctionnera sur toutes les distributions pour Raspberry Pi? Sur raspbian wheezy, cela semble fonctionner.
jnesselr

Réponses:


12

Vous pouvez utiliser le osmodule de Python pour obtenir ces informations via uname:

import os
os.uname()

Cette fonction devrait fournir une plate-forme et d'autres informations sur la plupart des distributions Linux ou Unix.

Dans la documentation Python:

os.uname ()

Renvoie un tuple contenant des informations identifiant le système d'exploitation actuel. Le tuple contient cinq chaînes: (sysname, nodename, release, version, machine). Certains systèmes tronquent le nom de nœud à huit caractères ou au composant principal; une meilleure façon d'obtenir le nom d'hôte est socket.gethostname()ou même socket.gethostbyaddr(socket.gethostname()).

Disponibilité: versions récentes d'Unix.


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

2
Quiconque regarde cela maintenant, nous avons fini par faire os.uname () [4] .startsWith ("arm") pour vérifier.
jnesselr

2
@jnesselr minuscule faute de frappe, ce n'est startswithpas le cas startsWith. Merci, ça a aidé.
Nishant

5

J'ai trouvé que vous pouvez obtenir le modèle et la version Pi à partir de:

/ sys / firmware / devicetree / base / model

Ex: Raspberry Pi 3 Model B Rev 1.2

J'ai un script shell pour rechercher cela et retourner le contenu s'il existe. Un appel du système d'exploitation pour lire le fichier s'il existe devrait vous redresser. La prémisse est, si elle n'existe pas, ce n'est certainement pas un RPi. Si c'est le cas, inspectez le contenu pour en être sûr.


3

C'est plus un problème avec l'avènement du Pi 2 (qui n'est pas simple à distinguer du Beaglebone Black). Le niveau de détail le plus élevé se trouve dans / proc / cpuinfo sur les systèmes basés sur Linux (la ligne «Matériel»). Voici un exemple d'analyse de cela, à partir du code GPIO Adafruit:

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


1
Cela me semble être la meilleure réponse, car j'aurais suggéré de tester / proc / cpuinfo. Je n'ai jamais vu le platform.py d'Adafruit auparavant, mais en le regardant, cela a du sens. De plus, si le fichier n'existe pas, vous saurez qu'il ne s'agit pas d'un système basé sur Linux. Merci pour cela :). Ayez mon +1.
Peter

J'ai rencontré cela hier en essayant de faire fonctionner py-gaugette avec mon Pi2 ... il utilise (actuellement) la méthode du module de plate-forme qui échoue malheureusement avec le Pi2 et j'espère en bénéficier également. github.com/guyc/py-gaugette/issues/12
MartyMacGyver

3

Les meilleures informations d'identification de système largement applicables que j'ai trouvées concernent:

platform._syscmd_uname('-a')

Cela semble donner la même sortie que la commande shell uname -a. Dans la plupart des cas, la sortie renvoyée est essentiellement la même (une chaîne au lieu d'un 5-tuple) que celle de os.uname().

Ceux que j'ai testés et trouvé des sorties équivalentes sont OSX 10.9.5, Ubuntu 14.04 et Raspbian (??) Wheezy. Sur un Synology NAS, cependant, j'obtiens plus d'informations de la 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+'

En voyant «synology» dans la sortie, il l'identifie comme un environnement où les choses se comportent de façon inattendue.


1

Meilleure façon de procéder ( extrait de code 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

Sur PI 3

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

Car:

uname -a
Linux raspberrypi 4.4.50-v7+ #970 SMP Mon Feb 20 19:18:29 GMT 2017 armv7l GNU/Linux

8
'raspberrypi' votre nom d'hôte - cela ne fonctionnera pas si vous changez le nom d'hôte en autre chose
rhu
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.