20

I've got a python script that uses sys.platform.startswith('linux') to test if it is on linux or not, but then I can't tell the difference between the x86/64 processor, and the raspberry pi's ARM processor.

The reason I need this, is to run an external script that's compiled for either mac, linux x86/64, or linux ARM for the raspberry pi.

From what I can tell, there's not really a unified way to tell that you are in fact running on a raspberry pi. Any help would be appreciated.

  • 1
    Can you use os.uname() to obtain this information? – milancurcic Feb 24 '13 at 17:12
  • Will that work on all distros for raspberry pi? On raspbian wheezy, it seems to work. – jnesselr Feb 24 '13 at 17:30
9

You can use Python's os module to obtain this information through uname:

import os
os.uname()

This function should provide platform and other information on most Linux or Unix-like distributions.

From the Python documentation:

os.uname()

Return a 5-tuple containing information identifying the current operating system. The tuple contains five strings: (sysname, nodename, release, version, machine). Some systems truncate the nodename to eight characters or to the leading component; a better way to get the hostname is socket.gethostname() or even socket.gethostbyaddr(socket.gethostname()).

Availability: recent flavors of Unix.

  • 1
    os.uname()[4][:3] == 'arm' – OrangeTux Jul 6 '13 at 13:09
  • 1
    Anyone who looks at this now, we ended up doing os.uname()[4].startsWith("arm") to check. – jnesselr Jan 26 '14 at 7:27
  • 1
    @jnesselr tiny typo, it is startswith, not startsWith. Thanks, it helped. – Nishant Oct 4 '14 at 9:49
6

I found you can get the Pi model and version from:

/sys/firmware/devicetree/base/model

Ex: Raspberry Pi 3 Model B Rev 1.2

I have a shell script to look for this and return the contents if it exists. An OS call to read the file if it exists should set you right. The premise is, if it doesn't exist, its definitely not a RPi. If it does, then inspect the content to be sure.

3

This is more of a problem with the advent of the Pi 2 (which is not simple to distinguish from the Beaglebone Black). The highest level of detail is found in /proc/cpuinfo on Linux-based systems (the 'Hardware' line). Here's an example of parsing that, from the Adafruit GPIO code:

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

  • 1
    This sounds like the best answer to me, since I would have suggested testing /proc/cpuinfo. I've never seen the platform.py from adafruit before, but looking over it, it makes sense. Also if the file doesn't exist, you'll know it's not a linux based system. Thanks for this :). Have my +1. – Peter Feb 18 '15 at 4:35
  • I encountered this yesterday when trying to get py-gaugette working with my Pi2... it (currently) uses the platform module method that unfortunately fails with the Pi2 and will hopefully benefit from this as well. github.com/guyc/py-gaugette/issues/12 – MartyMacGyver Feb 18 '15 at 7:30
3

The best widely-applicable system-identifying information I have found has been with:

platform._syscmd_uname('-a')

This appears to give the same output as the shell command uname -a. In most cases the returned output is essentially the same (a string instead of a 5-tuple) as that of os.uname().

The ones I've tested and found equivalent outputs are OSX 10.9.5, Ubuntu 14.04, and Raspbian (??) Wheezy. On a Synology NAS, though, I get more information from the platform._syscmd_uname('-a') version:

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

Seeing "synology" in the output there identifies it as an environment where things behave unexpectedly.

1

On PI 3

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

Because:

uname -a
Linux raspberrypi 4.4.50-v7+ #970 SMP Mon Feb 20 19:18:29 GMT 2017 armv7l GNU/Linux
  • 5
    'raspberrypi' your hostname - this won't work if you change the hostname to something else – rhu Jul 19 '17 at 16:08
0

Better way of doing this (Python code snippet):

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

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.