파이에서 파이썬 프로그램이 실행되고 있음을 감지


23

sys.platform.startswith ( 'linux')를 사용하여 Linux에 있는지 여부를 테스트하는 python 스크립트가 있지만 x86 / 64 프로세서와 라즈베리 파이의 ARM의 차이점을 알 수 없습니다 프로세서.

내가 필요한 이유는 mac, linux x86 / 64 또는 raspberry pi 용 Linux ARM 용으로 컴파일 된 외부 스크립트를 실행하기 때문입니다.

내가 말할 수있는 것에서, 실제로 라즈베리 파이에서 달리고 있다고 말하는 통일 된 방법은 없습니다. 도움을 주시면 감사하겠습니다.


1
os.uname ()을 사용하여이 정보를 얻을 수 있습니까?
milancurcic

라즈베리 파이의 모든 배포판에서 작동합니까? 라즈 비아 어 wheezy에서는 작동하는 것 같습니다.
jnesselr

답변:


12

Python os모듈을 사용하여 다음을 통해이 정보를 얻을 수 있습니다 uname.

import os
os.uname()

이 기능은 대부분의 Linux 또는 Unix 계열 배포판에 대한 플랫폼 및 기타 정보를 제공해야합니다.

파이썬 문서에서 :

os.uname ()

현재 운영 체제를 식별하는 정보가 포함 된 5 개의 튜플을 반환합니다. 튜플에는 5 개의 문자열 (sysname, nodename, release, version, machine)이 있습니다. 일부 시스템은 노드 이름을 8 자 또는 선행 구성 요소로 자릅니다. 호스트 이름을 얻는 더 좋은 방법은 socket.gethostname()또는 socket.gethostbyaddr(socket.gethostname())입니다.

가용성 : 최근 유닉스의 맛.


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

2
지금 이것을 본 사람이라면 누구나 os.uname () [4] .startsWith ( "arm")를 수행하여 확인했습니다.
jnesselr

2
@ jnesselr 작은 오타 startswith, 그렇지 않습니다 startsWith. 고마워요.
Nishant

5

Pi 모델과 버전을 다음에서 얻을 수 있음을 발견했습니다.

/ sys / firmware / devicetree / base / model

예 : 라즈베리 파이 3 모델 B Rev 1.2

이것을 찾아서 내용을 반환하는 쉘 스크립트가 있습니다. 파일이 존재하면 파일을 읽기위한 OS 호출이 올바른 설정이되어야합니다. 전제는 존재하지 않으면 분명히 RPi가 아닙니다. 그렇다면 내용을 검사하여 확인하십시오.


3

이것은 Pi 2 (비글 본 블랙과 구별하기가 쉽지 않음)의 출현과 관련하여 더 많은 문제입니다. 최고 수준의 세부 사항은 Linux 기반 시스템 ( '하드웨어'라인)의 / proc / cpuinfo에 있습니다. 다음은 Adafruit GPIO 코드에서 구문 분석하는 예입니다.

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


1
/ proc / cpuinfo 테스트를 제안 했으므로 이것은 나에게 가장 좋은 대답처럼 들립니다. 나는 전에 adafruit에서 platform.py를 본 적이 없지만 그것을 살펴보면 의미가 있습니다. 또한 파일이 존재하지 않으면 Linux 기반 시스템이 아니라는 것을 알게 될 것입니다. 이것에 감사드립니다 :). +1해야합니다.
Peter

어제 Pi2와 함께 작동하는 py-gaugette을 얻으려고 할 때이 문제가 발생했습니다 ... 현재 (현재) 불행히도 Pi2에서 실패하는 플랫폼 모듈 방법을 사용하므로 희망적 으로이 혜택을 누릴 수 있습니다. 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 및 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+'

출력에서 "synology"를 보면 예상치 못한 동작이 발생하는 환경으로 식별됩니다.


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'호스트 이름-호스트 이름을 다른 이름으로 변경하면 작동하지 않습니다
rhu

0

이 작업을 수행하는 더 좋은 방법 (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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.