ตรวจพบว่าโปรแกรมไพ ธ อนกำลังทำงานอยู่บนไพ


23

ฉันมีสคริปต์ไพ ธ อนที่ใช้ sys.platform.startswith ('linux') เพื่อทดสอบว่าเป็น linux หรือไม่ แต่จากนั้นฉันไม่สามารถบอกความแตกต่างระหว่างโปรเซสเซอร์ x86 / 64 และ ARM ของราสเบอร์รี่ หน่วยประมวลผล

เหตุผลที่ฉันต้องการสิ่งนี้คือการเรียกใช้สคริปต์ภายนอกที่รวบรวมไว้สำหรับ mac, linux x86 / 64 หรือ linux ARM สำหรับ raspberry pi

จากสิ่งที่ฉันสามารถบอกได้ไม่มีวิธีการแบบครบวงจรจริงๆที่จะบอกว่าคุณกำลังวิ่งอยู่บนราสเบอร์รี่ปี่ ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม


1
คุณสามารถใช้ os.uname () เพื่อรับข้อมูลนี้ได้หรือไม่?
milancurcic

จะทำงานกับ distros ทั้งหมดสำหรับราสเบอร์รี่ Pi หรือไม่ ในวันที่เสียงฮิปปี้ดูเหมือนว่าจะทำงาน
jnesselr

คำตอบ:


12

คุณสามารถใช้osโมดูลPython เพื่อรับข้อมูลนี้ผ่านuname:

import os
os.uname()

ฟังก์ชั่นนี้ควรจัดเตรียมแพลตฟอร์มและข้อมูลอื่น ๆ เกี่ยวกับลีนุกซ์หรือยูนิกซ์

จากเอกสาร Python:

os.uname ()

ส่งคืน 5-tuple ที่มีข้อมูลซึ่งระบุถึงระบบปฏิบัติการปัจจุบัน tuple มีห้าสาย: (sysname, nodename, release, version, machine) ระบบบางระบบสามารถตัดชื่อโหนดให้มีความยาวแปดตัวอักษรหรือองค์ประกอบนำ วิธีที่ดีกว่าที่จะได้รับชื่อโฮสต์เป็นหรือแม้กระทั่งsocket.gethostname()socket.gethostbyaddr(socket.gethostname())

มีจำหน่าย: รสชาติล่าสุดของ Unix


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

2
ใครก็ตามที่มองสิ่งนี้ในตอนนี้เราก็ลงเอยด้วยการทำ os.uname () [4] .startsWith ("arm") เพื่อตรวจสอบ
jnesselr

2
พิมพ์ผิดเล็ก ๆ @jnesselr มันเป็นไม่ได้startswith startsWithขอบคุณมันช่วยได้
Nishant

5

ฉันพบว่าคุณจะได้รับรุ่น Pi และรุ่นจาก:

sys / / เฟิร์มแว / devicetree / ฐาน / รุ่น

ตัวอย่าง: Raspberry Pi 3 รุ่น B Rev 1.2

ฉันมีเชลล์สคริปต์เพื่อค้นหาสิ่งนี้และส่งคืนเนื้อหาหากมีอยู่ การเรียกระบบปฏิบัติการเพื่ออ่านไฟล์หากมีอยู่ควรทำให้คุณถูกต้อง หลักฐานคือถ้ามันไม่มีอยู่จริงมันไม่ใช่ RPi แน่นอน ถ้าเป็นเช่นนั้นตรวจสอบเนื้อหาเพื่อให้แน่ใจ


3

นี่เป็นปัญหาของการมาถึงของ Pi 2 (ซึ่งไม่ใช่เรื่องง่ายที่จะแยกแยะจาก Beaglebone Black) รายละเอียดระดับสูงสุดพบได้ใน / proc / cpuinfo บนระบบที่ใช้ Linux (บรรทัด 'ฮาร์ดแวร์') นี่คือตัวอย่างของการแยกวิเคราะห์ว่าจากรหัส Adafruit GPIO:

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


1
นี่เป็นคำตอบที่ดีที่สุดสำหรับฉันเนื่องจากฉันอยากจะแนะนำการทดสอบ / proc / cpuinfo ฉันไม่เคยเห็น platform.py จาก adafruit มาก่อน แต่เมื่อมองดูมันก็สมเหตุสมผลแล้ว นอกจากนี้หากไฟล์ไม่มีอยู่คุณจะรู้ว่าไม่ใช่ระบบที่ใช้ลินุกซ์ ขอบคุณสำหรับสิ่งนี้ :). มี +1 ของฉัน
ปีเตอร์

ฉันพบสิ่งนี้เมื่อวานนี้เมื่อพยายามทำให้ py-gaugette ทำงานกับ Pi2 ของฉัน ... (ในปัจจุบัน) ใช้วิธีการโมดูลแพลตฟอร์มที่น่าเสียดายที่ล้มเหลวกับ Pi2 และหวังว่าจะได้รับประโยชน์จากสิ่งนี้เช่นกัน github.com/guyc/py-gaugette/issues/12
MartyMacGyver

3

ข้อมูลการระบุระบบที่ใช้งานได้ดีที่สุดที่ฉันพบคือ:

platform._syscmd_uname('-a')

uname -aนี้จะปรากฏขึ้นเพื่อให้การส่งออกเช่นเดียวกับคำสั่งของเชลล์ ในกรณีส่วนใหญ่ส่งออกกลับมาเป็นหลักเดียวกัน (สตริงแทนที่จะเป็น 5 tuple) os.uname()ที่เป็นที่ของ

สิ่งที่ฉันได้ทดสอบและพบว่าผลลัพธ์ที่เทียบเท่าคือ OSX 10.9.5, Ubuntu 14.04 และ Raspbian (??) Wheezy อย่างไรก็ตามใน Synology NAS ฉันได้รับข้อมูลเพิ่มเติมจากplatform._syscmd_uname('-a')เวอร์ชั่น:

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

การเห็น "ซินโนโลยี" ในเอาต์พุตมีการระบุว่าเป็นสภาวะแวดล้อมที่สิ่งต่าง ๆ ทำงานโดยไม่คาดคิด


0

ใน PI 3

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

เพราะ:

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

7
'raspberrypi' ชื่อโฮสต์ของคุณ - สิ่งนี้จะไม่ทำงานหากคุณเปลี่ยนชื่อโฮสต์เป็นอย่างอื่น
2560

0

วิธีที่ดีกว่าในการทำเช่นนี้ ( ตัวอย่างโค้ด 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()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.