4

我在 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 的系统上。

4

2 回答 2

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 3True上都返回,但尚未在其他环境中测试

该方法理论上存在缺陷:由于该方法使用的是os模块提供的环境列表,如果有人修改了它或者即使是Android平台也只是key中不包含ANDROID字,那么它会返回False

编辑Python 3.7+选项/变体

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

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

于 2021-08-15T21:08:58.517 回答
2

我试过os.uname()没有成功。所以我可能会建议使用 subprocess since uname -oreturns b'Android\n'

这是对Android的简单检查:

import subprocess
subprocess.check_output(['uname', '-o']).strip() == b'Android'
于 2020-06-01T14:48:58.197 回答