DreamForce,最近闲的蛋疼,所以开始学习Python。
Why Python?
其实我也纠结了很久,比如有Perl,RUBY等等等等。可是最终选择了Python,因为Google也选择了Python,其实Python的语言很简洁明了,再加上它鲜明的版式编码,让我也觉得很新奇。
Python能做什么?
很多人都会问这个问题,Python是一个跨平台的脚本,我相信作为业内人士,这一句话已经够解释很多了。Dreamforce本人之所以要学习和应用Python是为了弥补JAVA某些领域的不足,比如我C/C++真的很菜,我不可能为了一款简单的桌面工具而花费极大的学习成本,毕竟这些工具的开发只是为了提高效率而已,并不是作为我的主流产品的开发线。
关于本案例:
本案例是DreamForce在工作中,利用闲余时间实施的一个自动化布署工具。 因为工作中的项目环境配置是很繁琐的事情,你需要配置很多很多变量,修改相应的文件配置,复制,建用户,导数据,然后还需要用Ant进行Jboss布署。 一般不熟悉的新同事可能会为此花上一天的时间。所以借着学习Python的东风,我就开始进行了此款工具的开发。
开发最终产品构想:
软件实体: 可执行EXE文件
操作易用性: 只需用户输入相关的路径,即可自动进行相关环境的安装和布署
Python3.2
Dreamforce本人选择了3.2,这个和2.7的API还是有很大的区别,不过网上很多人都是使用的2.7,终其原因是因为Google App Engine使用的也是2.7版本。
但是因为本人第一次安装就用的3.2,而且也写了数十行可行代码了,就真心不想改动版本。。。我一向不喜欢重复劳动。
安装:
Python的安装很简单,官网下个Install版的就可以了,你也可以配置相关的环境变量,方便调用。如果你要使用一些第三方的Python相关的组件,可能需要环境变量的支持。
IDE:
IDE有很多可以选择的,我喜欢用Eclipse+PyDev ,PyDev是Eclipse的插件
Python也有自带的Python IDLE,也有纯Python制作的Eric,都是不错的IDE选择。
代码风格:
之前我提过Python有着鲜明的版式要求,我其实在用之前也只知道有这个要求,后来写代码的时候才发现这里面大有文章。
比如下面的IF条件控制语句:
if a>1: call functionA call functionB call functionC
我写到这才发现不对劲了,其实B和C的调用根本不在这个IF判断里,完了,Python里没有花括号,怎么分离代码块呢? 如何告诉Python在哪里结束IF语句呢?
其实Python的代码块的划分就是通过版式进行划分的。
if a>1: call functionA call functionB call functionC
将B和C缩进和IF并列后,就可以了。这样的效果就是IF语句只会包含A函数。
2.7与3.2
2.7与3.2最大最明显最坑爹的区别在于一个Print函数,也就是很多人在刚入门的时候跑HelloWorld也跑不通的原因就在于此。因为大多数小白第一次都会下载3.2,可悲的是网上的
Hello World的教程都几乎是2.7的,所以很多人连HelloWorld都没有关就直接放弃了这门语言。我也很讨厌Python这种做法,语言的更新最好不要进行API的修改。
2.7: print ‘HelloWorld’
3.2: print(‘HelloWorld’)
SVN CheckOut
我这个工具的第一个任务就是进行SVN的Checkout,它会自动的下载最新版的项目文件。 那作为Python如何调用SVN呢?
作为Window平台来说,使用Shell脚本无疑是一个很不错的选择:
def checkout(): cmd='svn checkout %(url)s %(dist)s --username %(user)s --password %(pwd)s'%setting print ("execute %s"%cmd) return os.system(cmd)
上面这个函数块定义了SVN Checkout的操作, os.system是加载命令行操作,运行CMD相关字符命令。
同理,Python要调用ANT也是如此,这里就不多作介绍了
Oracle数据库操作
这个工具里有一项任务是调用Oracle建立相应用户以及导入相关数据,这里需要用到Oracle驱动(cx_Oracle),将该驱动引入Python脚本后,就可以开始进行数据库连接了
orcl = cx_Oracle.connect(sysdba, mode=cx_Oracle.SYSDBA) curs = orcl.cursor() try: curs.execute("CREATE OR REPLACE DIRECTORY LTDDUMP_DIR as '"+LTDDUMP_DIR+"'") print('>>>Log:CREATE OR REPLACE DIRECTORY LTDDUMP_DIR as ' + LTDDUMP_DIR) curs.close() except: print('This script has errors') curs.close()
上面这个代码块是用SYSDBA管理帐户连接Oracle数据库,然后定义一个数据库系统变量。 请注意一定在使用后关闭连接。
IO读写以及字符编码问题
如果要进行读的同时还要写的话,建议分别开启读和写的流
profileProperties = codecs.open('dreamforce.properties') writeFileHandle= codecs.open('Temp','w','utf-8')
然后,读一行写一行。。这是我的小方法,很蹩脚但实用,编码问题也可以很好的避免。
最后要注意的是读写流的拆箱与装箱
mLines = profileProperties.readline() curTxt = mLines.decode() writeFileHandle.write(curTxt)
此次要注意,在写的时候,需要写入的是字符串,而不是流,但在读取的时候得到的是流。
EXE打包
做到最后,考虑到程序的移植性问题,其它同事没有装上Python,怎么来运行呢? 其实很简单,将其转化为相应的EXE文件即可在Window平台上使用了。
一般来说Python3.2的可以考虑使用,CX_Freezer 这个算是比较好用的3.2的转换器了。如果是Python2.7的话,可以考虑使用Python2Exe.也是比较好用的~
此案例到此结束,Anything questions you can contact me freely . : dreamforce.me or yangxin_xyx@163.com
高手啊、学习了,原来python这么强大…
新Python2Exe 也支持python3 ,我尝试CX_Freezer 不成功,反而是Python2Exe 成功了。
不过我本来用python创建轻量级GUI的,发现tinter是TCL/TK写的,生成exe后比较大(压缩后还要5M以上,内存消耗>20M),我就直接学习tcl/tk了,问题是语法和GUI运行效率比较低(压缩后2M,内存消耗<8M),我又学习了lua+IUP,语法比较近C,运行效率比较高(不压缩1M,内存消耗<3M)
PS: 我和你一样懒~