Pythonプログラムがpiで実行されていることを検出


23

sys.platform.startswith( 'linux')を使用してlinux上にあるかどうかをテストするpythonスクリプトがありますが、x86 / 64プロセッサとraspberry piのARMの違いがわかりませんプロセッサ。

これが必要な理由は、mac、linux x86 / 64、またはraspberry pi用のLinux ARM向けにコンパイルされた外部スクリプトを実行するためです。

私が言えることから、あなたが実際にラズベリーパイで実行されていることを伝えるための統一された方法はありません。任意の助けをいただければ幸いです。


1
os.uname()を使用してこの情報を取得できますか?
ミラノ語

それはラズベリーパイのすべてのディストリビューションで動作しますか?raspbian wheezyでは、動作するようです。
jnesselr

回答:


12

Pythonのosモジュールを使用して、次の方法でこの情報を取得できますuname

import os
os.uname()

この関数は、ほとんどのLinuxまたはUnixライクなディストリビューションに関するプラットフォームおよびその他の情報を提供する必要があります。

Pythonドキュメントから:

os.uname()

現在のオペレーティングシステムを識別する情報を含む5タプルを返します。タプルには、5つの文字列(sysname、nodename、release、version、machine)が含まれています。一部のシステムは、ノード名を8文字または先頭のコンポーネントに切り捨てます。ホスト名を取得するより良い方法は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 / firmware / devicetree / base / model

例:Raspberry Pi 3 Model 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してください。
ピーター

昨日、py-gaugetteをPi2で動作させようとしたときにこれに遭遇しました...(現在)残念ながら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+'

そこの出力で「シノロジー」を見ると、予期しない動作をする環境として識別されます。


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」あなたのホスト名-この仕事しませんあなたが何か他にホスト名を変更した場合
ルー

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.