有没有一种在Android上运行Python的方法?

2085

我们正在开发一个适用于S60平台的版本,该平台有一个很好的Python API。

然而,在Android上没有官方的Python支持,但由于Jython存在,是否有办法让蛇和机器人一起工作呢?

23个回答

1183

一种方法是使用Kivy

Kivy是一个开源Python库,用于快速开发应用程序,利用创新的用户界面,例如多点触控应用程序。

Kivy可以在Linux、Windows、OS X、Android和iOS上运行。您可以在所有支持的平台上运行相同的[python]代码。

Kivy Showcase应用程序


78
如果您使用Kivy,这里有一个工具可以帮助将您的项目打包成APK:https://github.com/kivy/python-for-android - gdw2
21
最近一周,我一直在尝试使用Kivy编写游戏。他们的主要开发人员非常快速地回答了我的IRC问题。但是如果你之前编写过GUI程序,Kivy会让你感到很困惑。以下是一些对我来说很奇怪且未记录的事情: 所有小部件都会接收到每个on_touch_down事件,即使事件发生在它们区域之外;没有一个小部件有draw()方法,几乎所有操作都通过他们自己定义的自定义属性上的自定义观察者模式完成(注意这些与Python的property名称相同,但不同于Python的property)。 - Trey Stout
9
@Trey: 那么关于非GUI相关的事情呢?使用Python模块是否有任何限制?访问Android特定功能如读取信息、添加通知、在后台工作、拍照、读取联系人列表、确定GPS位置等,是否会受到限制? - Tadeck
8
现在还支持iOS! - rubik
18
现在,将近一年后,支持情况有改善吗?是否有明显的进展? - TankorSmash
显示剩余5条评论

366

还有新的Android Scripting Environment (ASE/SL4A) 项目。它看起来非常棒,并且与原生的Android组件有一些集成。

注意:该项目不再处于“积极开发”状态,但可能存在一些分支。


71
没错,但是他们需要安装ASE,这不是一种可以让你在没有任何预先安装的情况下用Python编写Android应用程序的解决方案(普通用户可能会觉得“这个ASE是什么鬼?)。 - Stuart Axon
22
此外,ASE是一个受限制的环境;即使预装了ASE,也不能编写完整的Android应用程序。请参见https://dev59.com/u3I95IYBdhLWcg3w8y6N。 - Sridhar Ratnakumar
11
我认为它已经改名为SL4A。 - Vanuan
10
现在的SL4A已经可以编写应用程序、打包以及在Play商店上销售。自以上评论发布以来,它已经发展得很好。如果你想在Android上运行Python,那么运行于SL4A之上的PY4A可能是最佳选择。 - Carl Smith
3
我确认,SL4A现在允许编写已经准备好供使用的应用程序包。我尝试了使用Perl,它可以正常工作。 - ubugnu

231

是的! : Android Scripting Environment

Matt Cutts提供的一个示例,通过SL4A编写了一个条形码扫描器,只用了六行Python代码:

import android
droid = android.Android()
code = droid.scanBarcode()
isbn = int(code['result']['SCAN_RESULT'])
url = "http://books.google.com?q=%d" % isbn
droid.startActivity('android.intent.action.VIEW', url)

47
对于“YES”,我的翻译是“嗯,或许吧”。而对于“...it's extremely limited. anything graphical or multi touch? a big NO.”的翻译是“……它非常有限。任何图形或多点触控?绝对不行。” - gcb
4
@gcb 你无法使用普通的Android小部件集,但你可以使用"Webviews"(例如原生的Gmail应用程序使用的方式)。请注意,这里不是指解释或添加其他内容。 - gdw2
30
高尔夫球:import android as a;d=a.Android();d.startActivity('android.intent.action.VIEW',"http://books.google.com?q=%d"%int(d.scanBarcode()['result']['SCAN_RESULT']))该代码使用Python编写,通过Android模块调用Android系统的API。在扫描条形码后,会打开一个浏览器窗口,并搜索扫描结果所代表的书籍。 - Alex L
15
@gdw2,毫无疑问,原生的 Gmail 应用程序只使用 WebViews 解析电子邮件,而不是用于实际的用户界面。这使得比较有些荒谬。 - Veselin Romić

94

Pygame适用于Android的子集

Pygame是一个针对Python(在桌面上)的2D游戏引擎,受到新手程序员的欢迎。 Pygame适用于Android的子集 自述其为...

...将Pygame功能的子集移植到Android平台上。该项目的目标是允许创建特定于Android的游戏,并简化从类似PC的平台移植游戏的过程。

示例包括一个打包为APK的完整游戏,非常有趣。


5
我的Droid X手机出现了一些问题(按键或触摸屏,我记不清了),所以我在这方面没有取得什么进展。 - gdw2

91
作为一个Python爱好者和Android程序员,我很遗憾地说这不是一个好的选择。存在两个问题:
一个问题是,除了编程语言之外,Android开发工具还有很多其他内容。许多Android图形涉及到XML文件来配置显示,类似于HTML。内置的Java对象与此XML布局集成,比编写代码从逻辑到位图更容易。
另一个问题是,G1(以及可能的未来其他Android设备)并不那么快。200 MHz处理器和RAM非常有限。即使在Java中,如果你想让你的应用程序完美流畅,你也必须进行相当数量的重写以避免更多的对象创建。在移动设备上,Python仍然会太慢。

50
安卓手机不含任何 Java 代码,它在打包过程中被编译为字节码。速度并不是问题:谷歌可以提供工具将 Python 代码转换为正确的字节码(例如 Jython)。顺便说一句,Dalvik 不是 Java 虚拟机,所以这不是关于 Java VS Python。 - Bite code
10
JAVA字节码仍然需要通过JVM进行处理,而Java语言无论如何都需要垃圾回收器。真正的速度只能来自于C++。 - LtWorf
21
两年后,我们现在使用英特尔Atom处理器或八核处理器了。 ;) - Rohan Kandwal
3
由于手机所能提取的功率差异,它们的速度始终比桌面电脑慢一个数量级。但是,不要放弃在移动设备上使用Python,因为通常只有代码的一小部分负责处理处理器密集型工作,而这一部分可以通过用另一种语言重写来进行优化。 - Evgeni Sergeev
4
谷歌目前大力推广Kotlin这门语言,而对于大多数用户来说它是相当陌生的,因此可以清楚地看出,谷歌支持除Java以外的其他语言(我是Java开发者和Python爱好者)。因此,我认为答案更多是政治上的考虑,而非实用上的。 - Alex
2
@Alex 公平地说,Kotlin本身可以在JVM上运行和编译,因此与非JVM语言相比,集成它要容易得多。 - Kjeld Schmidt

82

Scripting Layer for Android

SL4A可以满足你的需求。你可以直接从他们的网站上安装它到你的设备上,无需root权限。

它支持多种编程语言,其中Python是最成熟的。默认情况下,它使用Python 2.6,但也有一个3.2版本可供使用。我在Galaxy S2上使用了该版本进行各种任务,效果很好。

API

SL4A为每种支持的编程语言提供了一个android库端口。该库通过单个Android对象提供对底层Android API的接口。

from android import Android

droid = Android()
droid.ttsSpeak('hello world') # example using the text to speech facade

每种语言基本上都有相同的API。你甚至可以在webview中使用JavaScript API。

let droid = new Android();
droid.ttsSpeak("hello from js");

用户界面

对于用户界面,您有三个选择:

  • 您可以通过API轻松使用通用的本地对话框和菜单。这对确认对话框和其他基本用户输入非常有用。
  • 您还可以从Python脚本内部打开Webview,然后使用HTML5进行用户界面设计。使用Python从Webview之间来回传递消息。UI将不是原生的,但仍然是一个好的选择。
  • 有一些关于本地Android用户界面的支持,但我不确定它的工作效果如何;我从未使用过。

您可以混合选项,因此可以在主界面中使用Web视图,并仍然使用本地对话框。

QPython

有一个名为QPython的第三方项目。它建立在SL4A之上,同时加入了一些其他有用的东西。

QPython为您提供更好的UI以管理您的安装,并包括一个小型触摸屏代码编辑器、一个Python shell和一个PIP shell用于软件包管理。他们也有一个Python 3端口。两个版本都可以免费从Play Store下载。QPython还捆绑了许多Python on Android项目的库,包括Kivy,因此它不仅仅是SL4A。

请注意,QPython仍在开发他们的SL4A分支(不过,说实话没有太多)。主要的SL4A项目本身已经几乎死亡了。

有用的链接


2
你能用其中任何一个在终端或任务管理器中运行Python脚本吗?我找不到方法 :( - Pitto
2
你可以从Tasker启动一个SL4A脚本。这个页面上有一些示例,其中包含从Tasker启动Python代码片段的代码。不过这实际上是一个完全不同的问题。 - Carl Smith

82

交叉编译 & Ignifuga

我的博客提供了 关于如何交叉编译Python 2.7.2到Android的说明和补丁

我还开源了Ignifuga,这是一个基于Python/SDL的2D游戏引擎,可以进行Android上的交叉编译。即使您不用它来制作游戏,也可能从代码或构建工具 (命名为Schafer,以Tim...你知道的那个人命名) 中获得有用的想法。


5
不错。加一分。但不被接受,因为这样写的内容无法为公众所理解。 - Bite code
2
如果你的意思是说它不能用于图形应用程序,那么你肯定可以,当然,需要更多的工作。我实际上使用这个端口结合SDL 1.3,从Python解释器到交互式应用程序并不容易,但是可以做到。 - gabomdq

67

12
Termux太好用了,绝对是一个优秀的工作环境。软件仓库中有很多选择,音量按钮快捷键也很方便。我觉得它是手机上最接近Debian的东西了。+1。 - James

59

Kivy

我想补充一下@JohnMudd所写的关于Kivy的内容。他描述的情况已经过去多年,Kivy已经有了很大的发展。

Kivy最大的卖点,在我看来,是其跨平台兼容性。你可以使用任何桌面环境(Windows/*nix等)编写和测试所有代码,然后将应用程序包装成为包括Android、iOS、MacOS和Windows在内的多个不同平台的应用程序(虽然应用可能缺乏本机的外观和感觉)。

通过Kivy自己的KV语言,您可以轻松地编写和构建GUI界面(就像Java XML一样,但是KV有自己的ui.widgets进行类似的翻译),在我看来非常容易掌握。

目前,Buildozerpython-for-android是构建和打包应用程序的最推荐工具。我已经尝试过它们两者,并且可以坚定地说,它们使使用Python构建Android应用程序变得轻松。他们的指南也都有很好的文档。

iOS是Kivy的另一个重要卖点。您可以通过kivy-ios Homebrew工具使用相同的代码库,只需要进行少量更改,然后在设备上运行(据我所知,Xcode需要进行构建,但iOS模拟器目前无法用于x86架构构建)。还有一些依赖性问题必须在Xcode中手动编译和调整,以实现成功构建,但它们不会太难解决,而且在Kivy Google Group中的人们也非常乐于助人。

总之,具有良好Python知识的用户应该没有问题能够快速掌握基础知识。

如果你正在使用Kivy进行更为严肃的项目开发,你可能会发现现有的模块不尽如人意。但是,也有一些可行的解决方案。通过(正在进行中的)pyjnius,用户可以访问Java/Objective-C类来控制一些本地API;通过pyobjus,用户也可以实现这一功能。


41
用Python制作Android应用程序在过去几年中取得了长足的进步。
一种新的方法是使用Python的FireMonkey (FMX)框架。 FMX是一个GUI框架,可用于开发多个平台的应用程序,其中Android是其中之一。
一旦完成编程,您可以使用PythonFMXBuilder构建自己的Android应用程序。

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