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.

jnesselr
fonte
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.

milancurcic
fonte
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.

Wesley Mason
fonte
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

MartyMacGyver
fonte
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.

Brock Mendel
fonte
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
Grzegorz Głowacki
fonte
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()
Artur Barseghyan
fonte