【问题标题】:Raspberry pi, python, detect os树莓派、python、检测操作系统
【发布时间】:2016-12-15 12:25:51
【问题描述】:

我正在开发一个 django 应用程序,它将在生产中的树莓派 3 上运行。

我必须在应用程序启动时知道它是在树莓派上运行还是在开发环境中运行。在开发中,我使用假传感器数据而不是引脚。

直到现在我都使用这种方法:

from sys import platform as _platform
test_environment = "win" in _platform or "darwin" in _platform

这对我的 pc 和 mac 都很好,但现在我想将它部署到在线的 ubuntu 网络服务器。 Raspbian 也是一个 linux dist,所以我需要别的东西。

这是我目前有效的解决方案,但它深深地伤害了我。有什么改进的建议吗?

try:
    import RPi.GPIO as gpio
    test_environment = False
except:
    test_environment = True

【问题讨论】:

    标签: python django raspberry-pi3


    【解决方案1】:

    您的解决方案基本上没问题 - 我会改进它以捕捉您真正要寻找的特定错误:

    try:
      import RPi.GPIO as gpio
      test_environment = False
    except (ImportError, RuntimeError):
      test_environment = True
    

    这样,如果发生其他错误(内存不足、control-c 时间不佳等),您将不会相信自己处于测试环境中,而实际上您不在测试环境中。您还可以添加更多检查以确保确定(例如,如果您使用的是 linux,则仅检查 import RPi.GPIO)。

    【讨论】:

    • python 中的口头禅是“先请求后宽恕”,所以使用 try except 来捕获错误而不是检查是否可能发生错误
    • RPi.GPIO 库在我的 linux 机器上抛出 RuntimeError,而不是 ImportError
    • 这里抛出一个ModuleNotFoundError(Linux,Py 3.7)。
    • 并且口头禅是“请求宽恕比许可更容易”EAFP :)
    【解决方案2】:

    此线程中有很好的信息: https://raspberrypi.stackexchange.com/questions/5100/detect-that-a-python-program-is-running-on-the-pi

    import platform
    def is_raspberry_pi() -> bool:
        return platform.machine() in ('armv7l', 'armv6l')
    

    【讨论】: