如何从Python脚本中检测Android操作系统?

5
我正在一个termux环境中在安卓设备上运行一个Python脚本,希望能够检测操作系统是否为安卓。
传统的方法不起作用:
>>> import platform
>>> import sys
>>> 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'

还有哪些开箱即用的选项可用?

似乎有一个有用的选项是platform.machine(),它返回armv8——这不仅仅是“Linux”,而是体系结构,不是操作系统,例如在树莓派或其他基于ARM的系统上可能会返回错误结果。


也许是 os.uname() - John Gordon
@JohnGordon os.uname() 返回 linux - Ozgur Bagci
2个回答

2

我尝试过使用 os.uname(),但是没有成功。因此我建议使用 subprocess,因为 uname -o 返回 b'Android\n'

这里是一个简单的检查 Android 的方法:

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

1
这可能可行,但它并不是基于Python的解决方案,因为它依赖于外部实用程序,并且会生成一个新进程。 - ccpizza
@ccpizza 我在网上搜索并尝试了不同的方法,但没有找到其他解决方案。对此很抱歉。 - Ozgur Bagci
感谢您抽出时间查看!非常感激! - ccpizza

1

有一种更简单的方法,不依赖于外部工具,只使用 sys 模块。 以下是代码:

import sys
is_android: bool = hasattr(sys, 'getandroidapilevel')

这是它的优缺点:
@@Pros@@
 + Does not depend on environment values
 + Does not depend on third-party modules
 + Simple one-liner (2 technically)

@@Cons@@
 - Version restriction (Supports CPython 3.7+ or equivalent)
 - Implementation-dependent (while CPython implements this I don't know about others)

我也看到过在这方面使用ANDROID_DATA。制作一个不同终端模拟器和SDK(如kivy或beeware)的默认环境内容列表会很有帮助。 - fuzzyTew
@fuzzyTew 不建议使用环境变量进行检测,因为这很容易被移除。最好升级到 CPython 3.7+ 并使用内置函数进行检测。 - UltraStudioLTD
(心里默默记下要在他的黑客中添加版本检测) - fuzzyTew
1
我只是想说,当有其他选择时,环境变量显然不是一个好选择,你在这里是正确的。在我的用例中,我正在欺骗底层库,这些库做出了错误的选择。除非我验证每个使用的库版本都使用了我正在使用的确切环境变量,为用户清楚地记录行为以便调试问题,并向上游提交问题报告,否则它实际上并不安全。版本检测将针对任何依赖包,我依赖其不安全行为。 - fuzzyTew
1
@ccpizza 如果我删除第一个答案,只留下第二个答案呢? - UltraStudioLTD
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接