用户想要在 Android 手机上运行一个 Python 程序,该程序既是一个 CGI 脚本,也是一个小数据库的基于 SMS 的交互系统。它是一个极低需求的系统(少数用户),由一个草根组织运行。但它需要稳定性,即不能有随机崩溃或宕机。由于各种原因,在 Android 手机上运行此程序可以解决现有设置的一些问题。然而,在深入研究之前,用户希望了解此类系统的可行性。它必须:
- 运行一个可以执行 CGI 脚本的 Web 服务器(原生 CGI)
- 响应短信
- 处理 SQlite 数据库
- 在 Python 中执行此操作(由于时间限制,无法移植到 Java)
此阶段不需要与手机用户交互。
用户意识到所需的部件存在 – 带有 CGI、SL4A 等的 Web 服务器。但是 Web 服务器似乎主要用于个人用途,而 SL4A 明确表示它“是 alpha 质量的软件”。SO 上关于 SL4A 的各种问题似乎也没有对这种用例多说些什么。它们专注于手机的应用程序开发(例如这个)。
简而言之,这样一个系统是否可以稳定运行?假设核心程序是健全的,是否可以依赖它?
2、解决方案
答案 1:
- CherryPy 是一个可靠的服务器,现在 Android 可能足够可靠,可以在其上构建服务器。
- 用户曾经维护一个使用 CherryPy 和 SL4A(带有 ws4py 用于 WebSocket)的项目。
- CherryPy 3.2.2 在 Python 2.6 和 Python 3.2 上运行完美。
- 该应用程序通常会运行一两天。如果它运行时间更长,似乎也没有问题,但由于它正在开发中,因此经常被重新启动。
- CherryPy 总是运行良好,但 Android 设备有时确实会崩溃,因此 SL4A 会时不时退出,需要重新启动。如果设备仅用作服务器,这可能不是问题。对用户来说,当设备整夜运行时它总是很稳定,但在正常使用设备时偶尔会崩溃(它是用户实际的手机)。所有这一切都是在 Galaxy SII 上进行的,当时 Android 还像这样非常容易出错。
- 设置 CherryPy 很容易。它是纯 Python,所以你只需将其复制到某个路径中并导入它即可(你也不需要模拟器)。
- 用户可能难以保持设备唤醒。如果置之不理,它将进入睡眠状态。你可以在开发人员选项中告诉它保持唤醒,但我很确定只有在设备正在充电时才会奏效。
更新:现在的 Android 更稳定了,但 SL4A 项目的工作已经基本结束。有一个名为 QPython 的项目将 SL4A 作为更大应用程序的一部分进行维护,因此这些事情仍然可以完成。
答案 2:
-
对于在 Android 中运行 Python CGI 脚本。基本上你需要一个能够在 Android 平台中运行 CGI 脚本的 Web 服务器,但找不到。你需要玩具 CGI 脚本来适应 Cherrypy Web 服务器,它可以在 Android 上运行。步骤如下:
-
首先我们需要在 Android(2.3)模拟器中下载 SL4A(r4)软件。可以通过使用 Android 浏览器访问 SL4A 网站来完成。现在在模拟器中安装该软件。
-
然后从同一个 SL4A 网站安装 Android 的 Python。它会下载版本 r4 的 apk。
-
启动 SL4A 应用程序并检查 HelloWorld python 脚本是否正在运行。它将确保你的安装正常。
-
现在是安装 Cherrypy 库模块的时候了。它可以在 http://www.cherrypy.org/wiki/CherryPyDownload 中找到。我已经采用了 3.2.0 版本。下载 Python 2.6 的 egg。
-
现在我们需要将 egg 文件传输到 Android 模拟器。使用 adb push 命令将 egg 文件传输到 /mnt/sdcard/Download。
-
从模拟器启动 Android 的 Python 并单击导入模块。它将列出新上传的 egg 文件。选择它并安装。
-
现在我们可以编写一个 Cherrypy 脚本作为 CGI 运行。以下是一个 HelloWorld 示例(从 Cherrypy 教程中获取,经过一些修改)。
# Import CherryPy global namespace
import cherrypy
class HelloWorld: “”" Sample request handler class. “”"
def index(self, **params):
# CherryPy will call this method for the root URI ("/") and send
# its return value to the client.
for key in params:
print key, '=', params[key]
return "Hello world!"
# Expose the index method through the web. CherryPy will never
# publish methods that don't have the exposed attribute set to True.
index.exposed = True
CherryPy always starts with app.root when trying to map request URIs
to objects, so we need to mount a request handler root. A request
to ‘/’ will be mapped to HelloWorld().index().
cherrypy.config.update({‘server.socket_host’: ‘127.0.0.1’}) cherrypy.config.update({‘server.socket_port’: 8080}) cherrypy.quickstart(HelloWorld(), ‘/’)
8> 需要将脚本传输到模拟器中的 /mnt/sdcard/sl4a/scripts 目录。然后你可以启动 SL4A 并点击脚本运行。如果你在 SL4A 控制台中运行,可以看到调试输出。 9> 在 Android 浏览器中,检查 URL http://localhost:8080/。它会显示“Hello world”。 这是我们可以放置 Python 脚本以访问 Android 手机数据和其他可以向外部客户端公开的内容的 Web 服务器设置。 鸣谢:在此处查看屏幕截图 其他信息: 交叉编译到 Android 的 micro-httpd(GET / POST / CGI 支持) Android 的 python 作为 CGI 脚本运行“Hello, world!”
我的建议:
我建议在树莓派中使用任何轻量级 Web 服务器(如 node.js)
答案 3:
- 这里有一个我的博客文章的链接,其中描述了如何使用 Py4A/SL4A 在大约 10 分钟内将你的 Android 手机变成一个基本的 CGI Web 服务器:http://matbaker.wordpress.com/2013/01/29/android-webserver-in-10-minutes/
评论前必须登录!
注册