Rileva che un programma Python è in esecuzione sul pi


23

Ho uno script Python che usa sys.platform.startswith ('linux') per testare se è su Linux o no, ma poi non posso dire la differenza tra il processore x86 / 64 e ARM di raspberry pi processore.

Il motivo per cui ho bisogno di questo è eseguire uno script esterno che sia compilato per mac, linux x86 / 64 o linux ARM per il raspberry pi.

Da quello che posso dire, non c'è davvero un modo unificato per dire che stai effettivamente correndo su un lampone pi. Qualsiasi aiuto sarebbe apprezzato.


1
Puoi usare os.uname () per ottenere queste informazioni?
milancurcic,

Funzionerà su tutte le distro per Raspberry Pi? Su raspbian wheezy, sembra funzionare.
jnesselr,

Risposte:


12

Puoi usare il osmodulo di Python per ottenere queste informazioni attraverso uname:

import os
os.uname()

Questa funzione dovrebbe fornire piattaforma e altre informazioni sulla maggior parte delle distribuzioni simili a Linux o Unix.

Dalla documentazione di Python:

os.uname ()

Restituisce una 5 tupla contenente informazioni che identificano il sistema operativo corrente. La tupla contiene cinque stringhe: (sysname, nodename, release, versione, machine). Alcuni sistemi troncano il nome nodo a otto caratteri o al componente principale; un modo migliore per ottenere il nome host è socket.gethostname()o anche socket.gethostbyaddr(socket.gethostname()).

Disponibilità: recenti versioni di Unix.


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

2
Chiunque lo guardi ora, abbiamo finito per fare os.uname () [4] .startsWith ("arm") per verificare.
jnesselr,

2
@jnesselr piccolo errore di battitura, è startswith, non è startsWith. Grazie, mi ha aiutato.
Nishant,

5

Ho scoperto che puoi ottenere il modello e la versione Pi da:

/ Sys / firmware / devicetree / base / modello

Esempio: Raspberry Pi 3 Modello B Rev. 1.2

Ho uno script di shell per cercare questo e restituire il contenuto se esiste. Una chiamata del sistema operativo per leggere il file, se esiste, dovrebbe essere corretta. La premessa è, se non esiste, sicuramente non è un RPi. In tal caso, ispeziona il contenuto per essere sicuro.


3

Questo è più un problema con l'avvento del Pi 2 (che non è semplice distinguere dal Beaglebone Black). Il più alto livello di dettaglio si trova in / proc / cpuinfo su sistemi basati su Linux (la linea 'Hardware'). Ecco un esempio di analisi che, dal codice GPIO di Adafruit:

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


1
Mi sembra la risposta migliore, dal momento che avrei suggerito di provare / proc / cpuinfo. Non ho mai visto platform.py da adafruit prima d'ora, ma guardarci sopra ha senso. Inoltre, se il file non esiste, saprai che non è un sistema basato su Linux. Grazie per questo :). Prendi il mio +1.
Peter,

L'ho incontrato ieri quando provavo a far funzionare la piometria con il mio Pi2 ... (attualmente) usa il metodo del modulo della piattaforma che sfortunatamente fallisce con il Pi2 e speriamo che ne trarrà beneficio anche. github.com/guyc/py-gaugette/issues/12
MartyMacGyver

3

Le migliori informazioni di identificazione del sistema ampiamente applicabili che ho trovato sono state con:

platform._syscmd_uname('-a')

Questo sembra fornire lo stesso output del comando shell uname -a. Nella maggior parte dei casi l'output restituito è essenzialmente lo stesso (una stringa anziché una 5 tupla) di quello di os.uname().

Quelli che ho testato e trovato output equivalenti sono OSX 10.9.5, Ubuntu 14.04 e Raspbian (??) Wheezy. Su un Synology NAS, tuttavia, ottengo ulteriori informazioni dalla platform._syscmd_uname('-a')versione:

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

Vedere "sinologia" nell'output lo identifica come un ambiente in cui le cose si comportano in modo imprevisto.


1

Modo migliore per farlo ( snippet di codice 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

Su PI 3

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

Perché:

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

8
'raspberrypi' il tuo nome host - questo non funzionerà se cambi il nome host in qualcos'altro
rhu
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.