【问题标题】:How to detect Android OS from a Python script?如何从 Python 脚本中检测 Android 操作系统?
【发布时间】:2020-09-19 21:24:03
【问题描述】:

我正在 Android 设备上的 termux 环境中运行 python 脚本,我希望能够检测到操作系统是 Android。

传统方法行不通:

>>> import platform
>>> import system
>>> print(platform.system())
'Linux'
>>> print(sys.platform)
'linux'
>>> print(platform.release())
'4.14.117-perf+'
>>> print(platform.platform())
'Linux-4.14.117-perf+-aarch64-with-libc'

还有哪些其他可用的 ootb 选项?

一个明显有用的选项是platform.machine(),它返回armv8——这不仅仅是“Linux”,但它只是架构,而不是操作系统,它可能会返回误报,例如在树莓派或其他基于 arm 的系统。

【问题讨论】:

  • 或许os.uname()?
  • @JohnGordon os.uname() 返回linux

标签: python android os-detection


【解决方案1】:

我试过os.uname() 没有成功。所以我可能会建议使用子进程,因为uname -o 返回b'Android\n'

这是一个针对 Android 的简单检查:

import subprocess
subprocess.check_output(['uname', '-o']).strip() == b'Android'

【讨论】:

  • 可以这样做,但这并不是真正基于 python 的解决方案,因为它依赖于外部实用程序,而且会产生一个新进程
  • @ccpizza 我在网上搜索并尝试了不同的方法,但无法找到其他解决方案。对此感到抱歉。
  • 感谢您花时间研究它!非常感谢!
【解决方案2】:

还有更简单的方法,不依赖于使用外部实用程序,只使用 os 模块。 这是代码:

import os # import **os** module, since we need it's *environ* variable

def isAndroid() -> bool: # function for fast usage
    for item in list(os.environ.keys()): # checks every **key** in **os.environ** dict
        if "ANDROID" in item.upper(): # if **key** contains word **ANDROID** then return True and break [Edit: Add `.upper()` so we can detect in lowercase env variables too]
            return True
    return False # returns False if no match happened

TermuxPydroid 3 上都返回 True,但尚未在其他环境中进行测试

该方法理论上存在缺陷: 由于此方法使用 os 模块提供的 environmental 列表,因此如果有人更改它或者它根本不包含 ANDROID 单词,即使它是Android平台,则返回False

编辑Python 3.7+ 选项/变体

import sys
is_android: bool = hasattr(sys, 'getandroidapilevel') # Availability = 3.7+

这个选项除了版本限制/可用性和在任何其他实现中可能未实现之外没有任何缺陷。

【讨论】:

  • 我也看到 ANDROID_DATA 用于此目的。最好列出不同终端仿真器和 sdk(如 kivy 或 beeware)的默认环境内容。
  • @fuzzyTew 使用环境变量进行检测并不总是一个好主意,因为它很容易移除。更好地升级到 CPython 3.7+ 并使用内置函数检测。
  • 我实际上处于这样一种情况,即我在仅针对其中一个或另一个编写的第三方代码中处理 kivy 和/或 termux,因此删除环境变量的能力非常有用。
  • 是的,因为在某些情况下依赖它们是不安全的。 :)
  • 我的意思是,当有其他选择时,环境变量显然是一个糟糕的选择。在我的用例中,我欺骗了做出这个糟糕选择的底层库。除非我验证所使用的库的每个版本都使用了我正在使用的确切环境变量,清楚地记录行为以供用户调试问题,并在上​​游提交问题报告,否则它实际上并不安全。版本检测将针对我所依赖的不安全行为的任何依赖包。
猜你喜欢
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 2014-03-11
  • 2012-02-05
  • 2019-10-04
  • 2012-05-31
  • 2012-07-02
相关资源
最近更新 更多