पता लगाएँ कि पाई पर एक अजगर कार्यक्रम चल रहा है


23

मुझे एक पायथन स्क्रिप्ट मिली है जो यह जांचने के लिए sys.platform.startswith ('linux') का उपयोग करती है कि क्या यह linux पर है या नहीं, लेकिन फिर मैं x86 / 64 प्रोसेसर और रास्प पाइ के ARM के बीच अंतर नहीं बता सकता प्रोसेसर।

मुझे इसकी आवश्यकता है, यह एक बाहरी स्क्रिप्ट को चलाने के लिए है जिसे रास्पबेरी पाई के लिए मैक, लिनक्स x86 / 64, या लिनक्स एआरएम के लिए संकलित किया गया है।

मैं जो बता सकता हूं, वहां वास्तव में यह बताने का एकीकृत तरीका नहीं है कि आप वास्तव में रास्पबेरी पाई पर चल रहे हैं। किसी भी सहायता की सराहना की जाएगी।


1
क्या आप यह जानकारी प्राप्त करने के लिए os.uname () का उपयोग कर सकते हैं?
मीलकुरिक

क्या वह रास्पबेरी पाई के लिए सभी विकृतियों पर काम करेगा? रास्पियन मट्ठा पर, यह काम करने लगता है।
17

जवाबों:


12

osइस जानकारी को प्राप्त करने के लिए आप पायथन के मॉड्यूल का उपयोग कर सकते हैं uname:

import os
os.uname()

इस फ़ंक्शन को अधिकांश लिनक्स या यूनिक्स जैसे वितरण पर प्लेटफ़ॉर्म और अन्य जानकारी प्रदान करनी चाहिए।

पायथन प्रलेखन से:

os.uname ()

वर्तमान ऑपरेटिंग सिस्टम की पहचान करने वाली जानकारी युक्त 5-टपल लौटें। टपल में पाँच तार होते हैं: (sysname, nodename, रिलीज़, संस्करण, मशीन)। कुछ प्रणालियाँ आठ अक्षरों या प्रमुख घटक के लिए नोडनैम को काटती हैं; होस्टनाम प्राप्त करने का एक बेहतर तरीका है socket.gethostname()या यहां तक ​​कि socket.gethostbyaddr(socket.gethostname())

उपलब्धता: यूनिक्स के हाल के स्वाद।


2
os.uname()[4][:3] == 'arm'
ऑरेंजट्यूक्स

2
अब जो कोई भी इसे देखता है, हमने जांच करने के लिए os.uname () [4] .startsWith ("बांह") करना समाप्त कर दिया।
जेंसेलर

2
@jnesselr छोटे टाइपो, यह startswithनहीं है startsWith। धन्यवाद, इससे मदद मिली।
निशांत

5

मैंने पाया कि आप पाई मॉडल और संस्करण यहां से प्राप्त कर सकते हैं:

/ Sys / फर्मवेयर / devicetree / आधार / मॉडल

Ex: रास्पबेरी पाई 3 मॉडल बी रेव 1.2

मेरे पास इसे देखने के लिए एक शेल स्क्रिप्ट है और यदि यह मौजूद है तो सामग्री वापस लौटाएं। यदि यह मौजूद है तो फ़ाइल को पढ़ने के लिए एक OS कॉल आपको सही सेट करना चाहिए। आधार है, अगर यह मौजूद नहीं है, तो निश्चित रूप से आरपीआई नहीं है। यदि ऐसा होता है, तो सुनिश्चित होने के लिए सामग्री का निरीक्षण करें।


3

यह पाई 2 के आगमन के साथ एक समस्या है (जो बीगलबोन ब्लैक से अलग करने के लिए सरल नहीं है)। लिनक्स-आधारित सिस्टम ('हार्डवेयर' लाइन) में उच्चतम स्तर का विस्तार / proc / cpuinfo में पाया जाता है। यहाँ यह उदाहरण है कि, Adafruit GPIO कोड से:

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


1
यह मेरे लिए सबसे अच्छा उत्तर लगता है, क्योंकि मैंने परीक्षण / proc / cpuinfo का सुझाव दिया होगा। मैंने पहले कभी भी प्लेटफ़ॉर्म को एडफ़र्ड से नहीं देखा है, लेकिन इसे देखते हुए, यह समझ में आता है। यदि फ़ाइल मौजूद नहीं है, तो भी आपको पता चलेगा कि यह एक लिनक्स आधारित प्रणाली नहीं है। इसके लिए धन्यवाद :)। मेरा +1 है।
पीटर

मुझे कल इस बात का सामना करना पड़ा जब अपने पी 2 के साथ काम करने की कोशिश कर रहा था ... यह (वर्तमान में) मंच मॉड्यूल विधि का उपयोग करता है जो दुर्भाग्य से पी 2 के साथ विफल हो जाता है और उम्मीद है कि इससे भी लाभ होगा। github.com/guyc/py-gaugette/issues/12
MartyMacGyver

3

सबसे बड़ी व्यापक रूप से लागू प्रणाली-पहचान की जानकारी जो मुझे मिली है वह है:

platform._syscmd_uname('-a')

यह शेल आउटपुट के समान आउटपुट देता है uname -a। ज्यादातर मामलों में, लौटा हुआ आउटपुट अनिवार्य रूप से एक ही होता है (5-ट्यूपल के बजाय एक स्ट्रिंग) os.uname()

जिन लोगों का मैंने परीक्षण किया है और समकक्ष आउटपुट पाया है वे हैं OSX 10.9.5, Ubuntu 14.04, और रास्पबियन (??) व्हीजी। एक 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+'

आउटपुट में "समानार्थी" को देखकर इसे एक ऐसे वातावरण के रूप में पहचाना जाता है जहां चीजें अप्रत्याशित रूप से व्यवहार करती हैं।


1

इसे करने का बेहतर तरीका (पायथन कोड स्निपेट ):

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()

-1

पीआई 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

8
अपने होस्टनाम को 'raspberrypi' करें - यदि आप hostname को किसी और चीज़ में बदलते हैं तो यह काम नहीं करेगा
rhu
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.