智能创客,中国最大的极客空间,智能平台,免费教学,视频教程,手把手教你创造儿时梦想!

标题: 《OpenWRT》03:python安装与脚本编写 [打印本页]

作者: znck007    时间: 2015-7-3 11:06
标题: 《OpenWRT》03:python安装与脚本编写
在OpenWRT里,我们使用到python源言,具有丰富和强大的类库,能够把用其他语言制作的各种模块(尤其是C)很轻松地联结在一起。
我们编写python脚本,可以直接运行,不需要再编译成可执行文件,因此他也成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。



OpenWRT版

opkg update
opkg install python


提示:编写python脚本后,然后python 脚本路径就可以执行了(《智能家居diy》图书在网关部份有介绍脚本编写)。

这里我们也详细的介绍,python脚本的几个实用的功能。
一、接收get或post参数,然后实行openwrt(linux命令)
[Python] 纯文本查看 复制代码

#!/usr/bin/python

import cgi, os
import commands

#设置输出格式为网页
print """\
Content-Type: text/html\n
"""

#读取get或post参数
form = cgi.FieldStorage()
# Get cmd string here.
cmdstring  = form['cmd']
#print cmdstring.value
#form.has_key("cmd")

#实行openwrt(linux命令)
(status, output) = commands.getstatusoutput(cmdstring.value)
#print status
print output


二、GET网络的天气预报
[Python] 纯文本查看 复制代码
#!/usr/bin/python

import cgi, os
import urllib

#生成数据
data = {}
data['date']='2012-04-15'
url_values=urllib.urlencode(data)

#设置天气网址
url='http://qdqx.qingdao.gov.cn/zdz/data.aspx'
full_url=url+'?'+url_values

#Get请求
response=urllib.urlopen(full_url)
result=response.read()

#写入到文本
f = open("text.txt",'wb')
f.write(result)
f.close()

#设置输出格式为网页
print """\
Content-Type: text/html\n
"""

print result



三、读写mysql函数
[Python] 纯文本查看 复制代码

#获取mysql数据
def SelectWorklist():
        try:
                #连接数据库
                conn=MySQLdb.connect(host='192.168.1.1',user='root',passwd='znck007',port=3306)
                cur=conn.cursor()                 
               
                conn.select_db('znckapi')#选择数据库名
               
                count=cur.execute('SELECT * FROM api_worklist WHERE status=0 ORDER BY id DESC LIMIT 0,1') #最后1条               
                #print "count="+str(count)
               
                repost=""
                results=cur.fetchall()
                if results :
                        for r in results:
                                #print str(r[0])+str(r[1])+str(r[2])+str(r[3])+str(r[4])+str(r[5])+str(r[6])
                                value0="%03d" % int(r[3].strip()) #转成00x格式
                                value1="%03d" % int(r[4].strip()) #转成00x格式

#更新调用次数,用来判断设备是否                               
                                cur.execute('UPDATE api_worklist SET num=num+1 where sid=%s and nid=%s and status=0',snvalue)

                conn.commit()#提交
                cur.close()#关闭
                conn.close()#关闭
               
                return repost
                       
        except MySQLdb.Error,e:
                print "Mysql Error %d: %s" % (e.args[0], e.args[1])
        except:
                print "SelectWorklist except..."
        return ""

         
#添加数据到mysql
def InsertWorklist(value):
        try:
               
                #连接数据库
                conn=MySQLdb.connect(host='192.168.1.1',user='root',passwd='znck007',port=3306)
                cur=conn.cursor()                 
               
                conn.select_db('znckapi')#选择数据库名               
                               
                now=time.strftime('%Y-%m-%d %H:%M:%S')#当前时间
               
                value0="%03d" % int(value[0].strip()) #转成00x格式
                value1="%03d" % int(value[1].strip()) #转成00x格式
                snvalue=[value0,value1]
                cur.execute('DELETE FROM api_worklist where type=2 and sid=%s and nid=%s and status>0',snvalue) #删除相同数据
               
                invalue=[2,0,value0,value1,value[2],"upload data",1,now,"192.168.1.1",0]
                cur.execute('INSERT INTO api_worklist(type,uid,sid,nid,data,note,status,time,ip,num)  VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)',invalue) #插入数据
               
                #更新执行成功{ck00x00xupdate}格式
                if( value[2]=='update' ):                       
                        cur.execute('UPDATE api_worklist SET status=1 where sid=%s and nid=%s',snvalue)       
       
                conn.commit()#提交
                cur.close()#关闭
                conn.close()#关闭
         
        except MySQLdb.Error,e:
                print "Mysql Error %d: %s" % (e.args[0], e.args[1])
                WriteLog(logpath,"Mysql Error %d: %s" % (e.args[0], e.args[1])) #写日志

        except:
                print "InsertWorklist except..."
       
        return ""




四、操作串口通信
[Python] 纯文本查看 复制代码


        ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1) #打开串口通信
        #ser.write("lABC") #向串口发送字符

while True:
        try:                                       
               
                data=ser.readline() #读取一行 读取1个字符read(1)               


                if data!="" :
                        #print "serial data <<<"+data
                        continue       


        except Exception,e:       
                print "except Error %s" % (e)
                time.sleep(1)
               
ser.close()





Windows版下载
https://www.python.org/downloads/


提示:本篇文章以下为windows版环境测试代码。

基本语法
Python的设计目标之一是让代码具备高度的可阅读性。它设计时尽量使用其它语言经常使用的标点符号和英文单字,让代码看起来整洁美观。它不像其他的静态语言如C、Pascal那样需要重复书写声明语句,也不像它们的语法那样经常有特殊情况和惊喜。
缩进
Python开发者有意让违反了缩进规则的程序不能通过编译,以此来强制程序员养成良好的编程习惯。并且Python语言利用缩进表示语句块的开始和退出(Off-side规则),而非使用花括号或者某种关键字。增加缩进表示语句块的开始,而减少缩进则表示语句块的退出。缩进成为了语法的一部分。例如if语句:
if age<21:
    print("你不能买酒。")
    print("不过你能买口香糖。")
print("这句话处於if语句块的外面。")


根据PEP的规定,必须使用4个空格来表示每级缩进(不清楚4个空格的规定如何,在实际编写中可以自定义空格数,但是要满足每级缩进间空格数相等)。使用Tab字符和其它数目的空格虽然都可以编译通过,但不符合编码规范。支持Tab字符和其它数目的空格仅仅是为兼容很旧的的Python程序和某些有问题的编辑程序。


控制语句
if语句,当条件成立时运行语句块。经常与else, elif(相当于else if) 配合使用。
for语句,遍历列表、字符串、字典、集合等迭代器,依次处理迭代器中的每个元素。
while语句,当条件为真时,循环运行语句块。
try语句。与except,finally配合使用处理在程序运行中出现的异常情况。
class语句。用于定义类型
def语句。用于定义函数和类型的方法。
pass语句。表示此行为空,不运行任何操作。
assert语句。用于程序调适阶段时测试运行条件是否满足。
with语句。Python2.6以后定义的语法,在一个场景中运行语句块。比如,运行语句块前加密,然后在语句块运行退出后解密。
yield语句。在迭代器函数内使用,用于返回一个元素。自从Python 2.5版本以后。这个语句变成一个运算符。
raise语句。制造一个错误。
import语句。导入一个模块或包。
from import语句。从包导入模块或从模块导入某个对象。
import as语句。将导入的对象赋值给一个变量。
in语句。判断一个对象是否在一个字符串/列表/元组里。



表达式
Python的表达式写法与C/C++类似。只是在某些写法有所差别。
主要的算术运算符与C/C++类似。+, -, *, /, //, **, ~, %分别表示加法或者取正、减法或者取负、乘法、除法、整除、乘方、取补、取模。>>, <<表示右移和左移。&, |, ^表示二进制的AND, OR, XOR运算。>, <, ==, !=, <=, >=用于比较两个表达式的值,分别表示大于、小于、等于、不等于、小于等于、大于等于。在这些运算符里面,~, |, ^, &, <<, >>必须应用于整数。
Python使用and, or, not表示逻辑运算。
is, is not用于比较两个变量是否是同一个对象。in, not in用于判断一个对象是否属于另外一个对象。
Python支持“列表推导式”(list comprehension),比如计算0-9的平方和:
>>> sum(x * x for x in range(10))
285
Python使用lambda表示匿名函数。匿名函数体只能是表达式。比如:
>>> add=lambda x, y : x + y
>>> add(3,2)
5
Python使用y if cond else x表示条件表达式。意思是当cond为真时,表达式的值为y,否则表达式的值为x。相当于C++和Java里的cond?y:x。
Python区分列表(list)和元组(tuple)两种类型。list的写法是[1,2,3],而tuple的写法是(1,2,3)。可以改变list中的元素,而不能改变tuple。在某些情况下,tuple的括号可以省略。tuple对于赋值语句有特殊的处理。因此,可以同时赋值给多个变量,比如:
>>> x, y=1,2#同时给x,y赋值,最终结果:x=1, y=2
特别地,可以使用以下这种形式来交换两个变量的值:
>>> x, y=y, x #最终结果:y=1, x=2
Python使用'(单引号)和"(双引号)来表示字符串。与Perl、Unix Shell语言或者Ruby、Groovy等语言不一样,两种符号作用相同。一般地,如果字符串中出现了双引号,就使用单引号来表示字符串;反之则使用双引号。如果都没有出现,就依个人喜好选择。出现在字符串中的\(反斜杠)被解释为特殊字符,比如\n表示换行符。表达式前加r指示Python不解释字符串中出现的\。这种写法通常用于编写正则表达式或者Windows文件路径。
Python支持列表切割(list slices),可以取得完整列表的一部分。支持切割操作的类型有str, bytes, list, tuple等。它的语法是...[left:right]或者...[left:right:stride]。假定nums变量的值是[1, 3, 5, 7, 8, 13, 20],那么下面几个语句为真:
nums[2:5] == [5, 7, 8] 从下标为2的元素切割到下标为5的元素,但不包含下标为5的元素。
nums[1:] == [3, 5, 7, 8, 13, 20] 切割到最后一个元素。
nums[:-3] == [1, 3, 5, 7] 从最开始的元素一直切割到倒数第3个元素。
nums[:] == [1, 3, 5, 7, 8, 13, 20] 返回所有元素。改变新的列表不会影响到nums。
nums[1:5:2] == [3, 5] 从下标为1的元素切割到下标为5的元素但不包含下标为5的元素,且步长为2。


函数
Python的函数支持递归、默认参数值、可变参数,但不支持函数重载。为了增强代码的可读性,可以在函数后书写“文档字符串”(Documentation Strings,或者简称docstrings),用于解释函数的作用、参数的类型与意义、返回值类型与取值范围等。可以使用内置函数help()打印出函数的使用帮助。比如:
>>> def randint(a, b):
... "Return random integer in range [a, b], including both end points."...
>>> help(randint)
Help on function randint in module __main__:
randint(a, b)
Return random integer inrange[a, b], including both end points.

对象的方法
对象的方法是指绑定到对象的函数。调用对象方法的语法是instance.method(arguments)。它等价于调用Class.method(instance, arguments)。当定义对象方法时,必须显式地定义第一个参数,一般该参数名都使用self,用于访问对象的内部数据。这里的self相当于C++, Java里面的this变量,但是我们还可以使用任何其它合法的参数名,比如this 和 mine 等,self与C++,Java里面的this不完全一样,它可以被看作是一个习惯性的用法,我们传入任何其它的合法名称都行,比如:
class Fish:
    def eat(self,food):
        if food is not None:
        self.hungry=False

class User:
    def__init__(myself,name):
        myself.name=name

#构造Fish的实例:
f=Fish()
#以下两种调用形式是等价的:
Fish.eat(f,"earthworm")
f.eat("earthworm")
u=User('username')
print(u.name)



Python认识一些以“__”开始并以“__”结束的特殊方法名,它们用于实现运算符重载和实现多种特殊功能。

类型
Python采用动态类型系统。在编译的时候,Python不会检查对象是否拥有被调用的方法或者属性,而是直至运行时,才做出检查。所以操作对象时可能会抛出异常。不过,虽然Python采用动态类型系统,它同时也是强类型的。Python禁止没有明确定义的操作,比如数字加字符串。
与其它面向对象语言一样,Python允许程序员定义类型。构造一个对象只需要像函数一样调用类型即可,比如,对于前面定义的Fish类型,使用Fish()。类型本身也是特殊类型type的对象(type类型本身也是type对象),这种特殊的设计允许对类型进行反射编程。
Python内置丰富的数据类型。与Java、C++相比,这些数据类型有效地减少代码的长度。

       除了各种数据类型,Python语言还用类型来表示函数、模块、类型本身、对象的方法、编译后的Python代码、运行时信息等等。因此,Python具备很强的动态性。


数学运算
Python使用与C、Java类似的运算符,支持整数与浮点数的数学运算。同时还支持复数运算与无穷位数(实际受限于计算机的能力)的整数运算。除了求绝对值函数abs()外,大多数数学函数处于math和cmath模块内。前者用于实数运算,而后者用于复数运算。使用时需要先导入它们,比如:
>>> import math
>>> print(math.sin(math.pi/2))
1.0
fractions模块用于支持分数运算;decimal模块用于支持高精度的浮点数运算。
Python定义求余运行a % b的值处于开区间[0, b)内,如果b是负数,开区间变为(b, 0]。这是一个很常见的定义方式。不过其实它依赖于整除的定义。为了让方程式:b * (a // b) + a % b = a恒真,整除运行需要向负无穷小方向取值。比如7 // 3的结果是2,而(-7) // 3的结果却是-3。这个算法与其它很多编程语言不一样,需要注意,它们的整除运算会向0的方向取值。
Python允许像数学的常用写法那样连着写两个比较运行符。比如a < b < c与a < b and b < c等价。C++的结果与Python不一样,首先它会先计算a < b,根据两者的大小获得0或者1两个值之一,然后再与c进行比较。









关注@智能创客  微信:znck007(打造DIY创客平台)







作者: mikeliujia    时间: 2015-7-12 08:57
so??????
作者: stjis    时间: 2015-8-9 17:36
一手货源号出售 各种精品服饰 首饰 鞋袜 护肤等等 全部厂家价 欢迎各位想创业的朋友咨询 微信peizong21  
作者: 青海论坛i    时间: 2015-9-12 15:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: kycup    时间: 2015-9-30 08:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: yixian520    时间: 2015-10-5 13:22
谢谢楼主分享
作者: alex_vip    时间: 2015-10-5 14:50
谢谢分享
作者: qq380540379    时间: 2015-10-12 16:52
赞一个!赞一个!赞一个!
作者: 惹尘    时间: 2015-10-17 07:20
不错学习了,python语言是门很强大的语言,希望智能创客在路由器上开发越来越多的功能
作者: tswtj    时间: 2015-11-2 15:30
提示: 作者被禁止或删除 内容自动屏蔽
作者: cfq1535    时间: 2015-11-7 10:24
谢谢楼主分享
作者: XXY    时间: 2015-12-15 09:19
很好,谢谢楼主的分享
作者: dnqs    时间: 2016-1-1 21:16
似懂非懂,谢谢分享
作者: drfat    时间: 2016-1-9 09:39
学习学习!
作者: zzcyzzcy    时间: 2016-1-23 20:44
赞一个!赞一个!赞一个!
作者: fawob    时间: 2016-2-17 14:53
说的不错!













作者: dpzkm    时间: 2016-2-26 00:57
真精神!!!!!!
作者: jsyemaozi    时间: 2016-2-29 15:09
挺好的。。学习了。。希望自己坚持住
作者: jackeyt    时间: 2016-3-3 11:43
不错。正在学习python~
作者: lk14d9    时间: 2016-3-19 22:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: dpzkm    时间: 2016-3-22 00:14
看的人少,回一下
作者: 镜花水月    时间: 2016-3-24 08:04
这个是真心的要学好,强大
作者: iwdlw    时间: 2016-4-4 00:14
〓金牌-投票███扣扣:119209911 ███微信:13911679882(手机)如有网上投票刷票需求就到金牌微信投票公司,将提供专业服务。

作者: rujgf    时间: 2016-4-11 23:53

作者: wuyue1994    时间: 2016-4-20 22:32
谢谢!学习啦
作者: 滴滴rs1    时间: 2016-5-10 02:25
滴滴司机业务:
一,司机账号多开:同一驾驶证,行驶证,可以重复注册。
二,拒单器:一对一订单无限拒单 不掉指派 指派百分百。
三,多点定位,全方位抢单,全方位跑街,接长途单
四,抢单加速器。

请联系微信号:dididichecheche












滴滴司机业务:
一,司机账号多开:同一驾驶证,行驶证,可以重复注册。
二,拒单器:一对一订单无限拒单 不掉指派 指派百分百。
三,多点定位,全方位抢单,全方位跑街,接长途单
四,抢单加速器。

请联系微信号:dididichecheche

作者: fnfbp    时间: 2016-6-13 20:03
说的不错!













作者: 方重明    时间: 2016-9-30 18:57
佩服你,能发这么好的帖子,厉害












某宝购买 视频教程 素材 软件 xiao视频 等资源  百度网盘免费下载   hao.wpan123.com
作者: 幼儿一班    时间: 2016-10-3 08:33
谢谢分享
作者: 荧光粉142    时间: 2016-10-16 13:16
没来得急看,应该不错,先帮你顶













作者: 月夜之星642    时间: 2016-10-17 02:46
水平很高啊,值得学习













作者: 荧光粉142    时间: 2016-10-20 10:04
强帖终于出现,要顶的啊,谢谢楼主













作者: 所有爱情都成    时间: 2016-10-20 13:21
说的不错!













作者: 毫克里364    时间: 2016-10-24 06:06
说的不错!













作者: xke瓯江帆影    时间: 2016-10-24 06:32
说的不错!













作者: yayou4838    时间: 2016-10-25 11:01
扫码关注,回复0有礼

作者: 929377130    时间: 2016-10-27 02:24
只为拿分早日调通111111111111
作者: 南国一梦web    时间: 2016-11-6 01:16
谢了.学习中,先顶













作者: 冰山瑞那ttl    时间: 2016-11-8 04:04
呵呵,好帖,好好看看

















欢迎光临 智能创客,中国最大的极客空间,智能平台,免费教学,视频教程,手把手教你创造儿时梦想! (http://luntan.znck007.com/) Powered by Discuz! X3.2