Detectar que um programa python está sendo executado no pi


23

Eu tenho um script python que usa sys.platform.startswith ('linux') para testar se está no linux ou não, mas não sei dizer a diferença entre o processador x86 / 64 e o ARM do raspberry pi processador.

A razão pela qual eu preciso disso é executar um script externo compilado para mac, linux x86 / 64 ou linux ARM para o raspberry pi.

Pelo que posso dizer, não há realmente uma maneira unificada de dizer que você está de fato rodando com um pi de framboesa. Qualquer ajuda seria apreciada.


1
Você pode usar os.uname () para obter essas informações?
milancurcic

Isso funcionará em todas as distros do raspberry pi? Em chiado raspbian, parece funcionar.
jnesselr

Respostas:


12

Você pode usar o osmódulo do Python para obter essas informações através de uname:

import os
os.uname()

Esta função deve fornecer plataforma e outras informações na maioria das distribuições do tipo Linux ou Unix.

Na documentação do Python:

os.uname ()

Retorne uma tupla com 5 tuplas que contém informações que identificam o sistema operacional atual. A tupla contém cinco seqüências de caracteres: (sysname, nodename, release, version, machine). Alguns sistemas truncam o nome do nó para oito caracteres ou para o componente principal; uma maneira melhor de obter o nome do host é socket.gethostname()ou mesmo socket.gethostbyaddr(socket.gethostname()).

Disponibilidade: sabores recentes do Unix.


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

2
Quem olha para isso agora, acabamos fazendo os.uname () [4] .startsWith ("arm") para verificar.
precisa saber é

2
@ tyness minúsculo jnesselr, é startswith, não startsWith. Obrigado, ajudou.
Nishant #

5

Eu descobri que você pode obter o modelo e versão do Pi em:

/ sys / firmware / devicetree / base / modelo

Ex: Raspberry Pi 3 Modelo B Rev 1.2

Eu tenho um script de shell para procurar por isso e retornar o conteúdo, se existir. Uma chamada do SO para ler o arquivo, se existir, deve ser o correto. A premissa é que, se não existir, definitivamente não é um RPi. Se houver, inspecione o conteúdo para ter certeza.


3

Isso é mais um problema com o advento do Pi 2 (que não é simples de distinguir do Beaglebone Black). O nível mais alto de detalhes é encontrado em / proc / cpuinfo em sistemas baseados em Linux (a linha 'Hardware'). Aqui está um exemplo de análise que, a partir do código Adafruit GPIO:

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


1
Parece a melhor resposta para mim, pois eu sugeriria testing / proc / cpuinfo. Eu nunca vi o platform.py do adafruit antes, mas, olhando por cima, faz sentido. Além disso, se o arquivo não existir, você saberá que não é um sistema baseado em Linux. Obrigado por isso :). Tenha o meu +1.
Peter Peter

Encontrei isso ontem ao tentar fazer com que o py-gaugette funcionasse com o meu Pi2 ... (atualmente) usa o método do módulo de plataforma que infelizmente falha com o Pi2 e espero que também se beneficie disso. github.com/guyc/py-gaugette/issues/12
MartyMacGyver

3

As melhores informações de identificação de sistemas amplamente aplicáveis ​​que encontrei foram:

platform._syscmd_uname('-a')

Isso parece dar a mesma saída que o comando shell uname -a. Na maioria dos casos, a saída retornada é essencialmente a mesma (uma sequência em vez de uma tupla de 5) que a de os.uname().

Os que eu testei e encontrei saídas equivalentes são OSX 10.9.5, Ubuntu 14.04 e Raspbian (??) Wheezy. Em um NAS Synology, no entanto, recebo mais informações da platform._syscmd_uname('-a')versão:

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

Ver "sinologia" na saída identifica-o como um ambiente em que as coisas se comportam inesperadamente.


0

No PI 3

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

Porque:

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

7
'raspberrypi' é o seu nome de host - isso não funcionará se você alterar o nome do host para outra coisa
rhu

0

Melhor maneira de fazer isso ( trecho de código 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()
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.