QPython与Python跨平台试验

Dec 15,2017   2505 words   9 min

Tags: Python

一、QPython

前几天逛Google Play的时候无意间发现了一个叫“QPython”的应用。其最大的特点就是可以在Android设备上运行Python脚本。 同时还有Python2和Python3的不同版本,甚至支持PIP安装第三方包。官网打出的广告也是”Python on Android.”。这下真是”Code anywhere”了。

而且通过在QPython中import特有的androidhelper包,还可以调用各种Android的API接口,实现各种功能。

1.Hello World小程序

例如下面的代码演示了让用户输入文字,并将其以Toast的方式显示的程序。

import androidhelper

droid = androidhelper.Android()
respond = droid.dialogGetInput("Hello", "What is your name?")
print respond
name = respond.result

if name:
    message = 'Hello, %s!' % name
else:
    message = "Hey! You didn't tell me your name."

droid.makeToast(message)

程序打开界面如下,有终端、编辑器、文件等功能。 然后在编辑器中打开上面这段代码,如下所示。 然后按底下的运行按钮,就会开始执行脚本了。弹出对话框,输入名字则会显示结果。

上面是最基本的QPython编程的例子,其实还可以进行更复杂的操作,如调用相机、手机震动等等。 官网更多内容在这里。也许我们可以用Python基于这些API开发出一个应用出来。

2.包管理

在QPython中也可以使用PIP进行包管理。进入“QPYPI”可以看到有些是内置的,直接点击下载就可以安装使用。 点击最上面即可进入PIP。例如我们可以安装一个wheel包。 然后就可以使用了。不过经过测试还是有一定局限性的,只能安装一些不需要编译的包,不能安装很复杂的包,如opencv等。

二、Python跨平台试验

虽然之前一直都知道Python是跨平台的,但一直没有自己尝试过。所以就简单写了个脚本。分别在Windows、Ubuntu、CentOS和Android上跑了。 这个脚本功能是搜索指定路径下的指定类型的图片文件,并将其进行高斯模糊,最后保存成新的图片。代码如下。

# coding= utf-8
import os
import platform
from PIL import Image, ImageFilter


def findAllFiles(root_dir, type):
    paths = []
    names = []
    for parent, dirname, filenames in os.walk(root_dir):
        for filename in filenames:
            if filename.endswith(type):
                paths.append(parent)
                names.append(filename)
    print paths.__len__(), " files found."
    return paths, names


def imageBlur(paths, names, separator):
    for i in range(len(paths)):
        img = Image.open(paths[i] + separator + names[i])
        img = img.filter(ImageFilter.GaussianBlur)
        img.save(paths[i] + separator + names[i].split(".")[0] + "_blur.png")
        print ((i + 1) * 1.0 / len(paths)) * 100, "% IMG saved at ", paths[i] + separator + names[i].split(".")[
            0] + "_blur.png"


def getOSType():
    print platform.uname()


def getSeparator():
    sysstr = platform.system()
    if (sysstr == "Windows"):
        separator = "\\"
    elif (sysstr == "Linux"):
        separator = "/"
    else:
        separator = "/"
    return separator


getOSType()
root_dir = raw_input("Input parent path of files:\n")
file_type = raw_input("Input type of images:\n")
paths, names = findAllFiles(root_dir, file_type)
imageBlur(paths, names, getSeparator())
1.Android平台

在test文件夹中准备了几个不同类型的文件如下。 在QPython中打开代码文件并运行,控制台输出如下,提示运行成功。 在文件管理器中可以看到,多了新生成的图片文件。在Android平台测试成功。 不过后来又在QPython上测试了如Matplotlib绘图等代码,报错运行不了。 看来还是有一定局限性的,并不是所有的代码都可以运行。

2.CentOS平台

将文件放到我的服务器上测试,服务器是CentOS 7。控制台输出如下,也成功运行,测试成功。

3.Ubuntu平台

在电脑上的Ubuntu下运行,也测试成功。

4.Windows平台

最后在Windows上运行,结果和输出如下。 测试成功。

三、小结

最后小结一下。Python的跨平台能力确实很厉害,提供的API也是高度抽象的。 程序员无需去管不通系统下到底如何遍历文件,只需要一句os.walk()即可获得想要的结果。 也算是一种提高工作效率的方式吧。最近在用Python批处理统计一些数据,深刻感受到提高了我的效率,节省了很多时间。 让我有空能玩手机、逛B站。人生苦短,我用Python吧。

本文作者原创,未经许可不得转载,谢谢配合

返回顶部