Phát hiện một chương trình python đang chạy trên pi


23

Tôi đã có một tập lệnh python sử dụng sys.pl platform.startswith ('linux') để kiểm tra xem nó có trên linux hay không, nhưng sau đó tôi không thể biết sự khác biệt giữa bộ xử lý x86 / 64 và ARM của raspberry pi bộ xử lý.

Lý do tôi cần điều này là để chạy một tập lệnh bên ngoài được biên dịch cho mac, linux x86 / 64 hoặc linux ARM cho raspberry pi.

Từ những gì tôi có thể nói, thực sự không có một cách thống nhất nào để nói rằng bạn thực tế đang chạy trên một quả mâm xôi pi. Bất kỳ trợ giúp sẽ được đánh giá cao.


1
Bạn có thể sử dụng os.uname () để có được thông tin này không?
milancurcic

Điều đó sẽ làm việc trên tất cả các bản phát hành cho mâm xôi pi? Trên raspbian wheezy, nó dường như làm việc.
jnesselr

Câu trả lời:


12

Bạn có thể sử dụng osmô-đun của Python để có được thông tin này thông qua uname:

import os
os.uname()

Chức năng này sẽ cung cấp nền tảng và thông tin khác trên hầu hết các bản phân phối giống như Linux hoặc Unix.

Từ tài liệu Python:

os.uname ()

Trả về một bộ 5 chứa thông tin xác định hệ điều hành hiện tại. Bộ dữ liệu chứa năm chuỗi: (sysname, gật đầu, phát hành, phiên bản, máy). Một số hệ thống cắt ngắn tên nút thành tám ký tự hoặc thành phần hàng đầu; một cách tốt hơn để có được tên máy chủ là socket.gethostname()hoặc thậm chí socket.gethostbyaddr(socket.gethostname()).

Sẵn có: hương vị gần đây của Unix.


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

2
Bất cứ ai nhìn vào điều này bây giờ, chúng tôi đã kết thúc việc thực hiện os.uname () [4] .startsWith ("arm") để kiểm tra.
jnesselr

2
@jnesselr typo nhỏ, nó là startswith, không startsWith. Cảm ơn, nó đã giúp.
Nishant

5

Tôi thấy bạn có thể lấy mô hình và phiên bản Pi từ:

/ sys / firmware / devicetree / cơ sở / mô hình

Vd: Raspberry Pi 3 Model B Rev 1.2

Tôi có một kịch bản shell để tìm kiếm cái này và trả về nội dung nếu nó tồn tại. Một cuộc gọi hệ điều hành để đọc tệp nếu nó tồn tại sẽ đặt bạn đúng. Tiền đề là, nếu nó không tồn tại, nó chắc chắn không phải là RPi. Nếu có, sau đó kiểm tra nội dung để chắc chắn.


3

Đây là một vấn đề với sự ra đời của Pi 2 (không đơn giản để phân biệt với Beaglebone Black). Mức độ chi tiết cao nhất được tìm thấy trong / Proc / cpuinfo trên các hệ thống dựa trên Linux (dòng 'Phần cứng'). Đây là một ví dụ về phân tích cú pháp đó, từ mã GPIO của Adaf nhung:

https://github.com/adafbean/Adafbean_Python_GPIO/blob/master/Adafbean_GPIO/Plevelop.py


1
Đây có vẻ là câu trả lời tốt nhất cho tôi, vì tôi đã đề nghị thử nghiệm / Proc / cpuinfo. Tôi chưa bao giờ thấy platform.txt từ adafbean trước đây, nhưng nhìn qua nó, nó có ý nghĩa. Ngoài ra nếu tệp không tồn tại, bạn sẽ biết đó không phải là hệ thống dựa trên linux. Cảm ơn vì điều đó :). Có +1 của tôi.
Peter

Tôi đã gặp điều này ngày hôm qua khi cố gắng để py-gaugette hoạt động với Pi2 của tôi ... hiện tại nó sử dụng phương pháp mô-đun nền tảng không may thất bại với Pi2 và hy vọng cũng sẽ được hưởng lợi từ điều này. github.com/guyc/py-gaugette/issues/12
MartyMacGyver

3

Thông tin nhận dạng hệ thống được áp dụng rộng rãi nhất mà tôi đã tìm thấy có:

platform._syscmd_uname('-a')

Điều này dường như cho cùng một đầu ra như lệnh shell uname -a. Trong hầu hết các trường hợp, đầu ra được trả về cơ bản là giống nhau (một chuỗi thay vì 5 tuple) như của đầu ra os.uname().

Những cái tôi đã thử nghiệm và tìm thấy kết quả đầu ra tương đương là OSX 10.9.5, Ubuntu 14.04 và Raspbian (??) Wheezy. Tuy nhiên, trên NAS Synology, tôi nhận được nhiều thông tin hơn từ platform._syscmd_uname('-a')phiên bản:

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

Nhìn thấy "synology" trong đầu ra, ở đó xác định nó là một môi trường nơi mọi thứ hoạt động bất ngờ.


0

Trên PI 3

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

Bởi vì:

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

7
'Raspberrypi' tên máy chủ của bạn - điều này sẽ không hoạt động nếu bạn thay đổi tên máy chủ thành tên khác
rhu

0

Cách tốt hơn để làm điều này ( đoạn mã 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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.