Mendeteksi bahwa program python sedang berjalan di pi

23

Saya punya skrip python yang menggunakan sys.platform.startswith ('linux') untuk menguji apakah ada di linux atau tidak, tapi kemudian saya tidak bisa membedakan antara prosesor x86 / 64, dan ARM raspberry pi. prosesor

Alasan saya memerlukan ini, adalah untuk menjalankan skrip eksternal yang dikompilasi untuk mac, linux x86 / 64, atau linux ARM untuk raspberry pi.

Dari apa yang bisa saya katakan, sebenarnya tidak ada cara terpadu untuk mengatakan bahwa Anda sebenarnya menggunakan pi raspberry. Bantuan apa pun akan dihargai.

jnesselr
sumber
1
Bisakah Anda menggunakan os.uname () untuk mendapatkan informasi ini?
milancurik
Akankah itu bekerja pada semua distro untuk raspberry pi? Pada wheezy raspbian, sepertinya berhasil.
jnesselr

Jawaban:

12

Anda dapat menggunakan osmodul Python untuk mendapatkan informasi ini melalui uname:

import os
os.uname()

Fungsi ini harus menyediakan platform dan informasi lain di sebagian besar distribusi Linux atau seperti Unix.

Dari dokumentasi Python:

os.uname ()

Kembalikan 5-tuple yang berisi informasi yang mengidentifikasi sistem operasi saat ini. Tuple berisi lima string: (sysname, nodename, rilis, versi, mesin). Beberapa sistem memotong nama panggilan ke delapan karakter atau ke komponen utama; cara yang lebih baik untuk mendapatkan hostname adalah socket.gethostname()atau bahkan socket.gethostbyaddr(socket.gethostname()).

Ketersediaan: rasa terbaru dari Unix.

militer
sumber
2
os.uname()[4][:3] == 'arm'
OrangeTux
2
Siapa pun yang melihat ini sekarang, kami akhirnya melakukan os.uname () [4] .startWith ("arm") untuk memeriksa.
jnesselr
2
@ jnesselr kesalahan ketik kecil, itu startswithtidak startsWith. Terima kasih, ini membantu.
Nishant
5

Saya menemukan Anda bisa mendapatkan model dan versi Pi dari:

/ sys / firmware / devicetree / base / model

Contoh: Raspberry Pi 3 Model B Rev 1.2

Saya memiliki skrip shell untuk mencari ini dan mengembalikan konten jika ada. Panggilan OS untuk membaca file jika ada seharusnya membuat Anda benar. Premisnya adalah, jika tidak ada, itu pasti bukan RPi. Jika ya, maka periksa isinya untuk memastikan.

Wesley Mason
sumber
3

Ini lebih merupakan masalah dengan munculnya Pi 2 (yang tidak mudah dibedakan dari Beaglebone Black). Level detail tertinggi ditemukan di / proc / cpuinfo pada sistem berbasis Linux (baris 'Hardware'). Berikut adalah contoh untuk menguraikan itu, dari kode GPIO Adafruit:

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

MartyMacGyver
sumber
1
Ini kedengarannya jawaban terbaik bagi saya, karena saya akan menyarankan pengujian / proc / cpuinfo. Saya belum pernah melihat platform.py dari adafruit sebelumnya, tetapi melihat itu, masuk akal. Juga jika file tersebut tidak ada, Anda akan tahu itu bukan sistem berbasis linux. Terima kasih untuk ini :). Dapatkan +1 saya.
Peter
Saya menemukan ini kemarin ketika mencoba membuat py-gaugette bekerja dengan Pi2 saya ... itu (saat ini) menggunakan metode modul platform yang sayangnya gagal dengan Pi2 dan mudah-mudahan akan mendapat manfaat dari ini juga. github.com/guyc/py-gaugette/issues/12
MartyMacGyver
3

Informasi pengidentifikasi sistem terbaik yang dapat diterapkan secara luas yang saya temukan adalah dengan:

platform._syscmd_uname('-a')

Ini tampaknya memberikan output yang sama dengan perintah shell uname -a. Dalam kebanyakan kasus, output yang dikembalikan pada dasarnya sama (string bukannya 5-tuple) seperti pada os.uname().

Yang sudah saya uji dan temukan output yang setara adalah OSX 10.9.5, Ubuntu 14.04, dan Raspbian (??) Wheezy. Pada NAS Synology, saya mendapatkan lebih banyak informasi dari platform._syscmd_uname('-a')versi:

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

Melihat "synology" dalam output di sana mengidentifikasinya sebagai lingkungan di mana hal-hal berperilaku tak terduga.

Brock Mendel
sumber
1

Cara yang lebih baik untuk melakukan ini ( cuplikan kode 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
sumber
-1

Pada PI 3

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

Karena:

uname -a
Linux raspberrypi 4.4.50-v7+ #970 SMP Mon Feb 20 19:18:29 GMT 2017 armv7l GNU/Linux
Grzegorz Głowacki
sumber
8
'raspberrypi' nama host Anda - ini tidak akan berhasil jika Anda mengubah nama host menjadi sesuatu yang lain
rhu