hello Python world

最近在捣鼓Python(名词解释:英文版中文版)。语言简单了就是好,很快就能上手。按惯例新语言总要写个“hello world”祭刀,但是蟒蛇语言的“hello world”过于简单(就一句话:print ‘hello world’),所以总得整点什么有实用价值的来写着玩。

作下面这坨东西的需求是:我想让系统裸体快速启动,这样需要一个脚本把现在自动启动的所有进程都放进去——很像是bat干的事情。只可惜Windows的bat实在太弱,不仅是串行的,而且是阻塞的。只有某一行进程退出之后,才会运行下一行的进程。所以如果想同时启动两个以上进程,根本没戏。下面这段代码可以解决这个问题,一次启动一大堆,然后自己就滚蛋了。如果没心情往下看也没关系,猛击此处下载可执行程序,使用说明在readme.txt里面,拿去用就是。代码在python 2.5.2下编写通过,转换成windows下可独立运行的exe使用了py2exe这个扩展。

程序运行流程是:从命令行参数中读入一个文件名(L41~L44),打开这个文件(L22),将这个文件的每一行读出并取出“//”和”回车”之前的字符串头部(L27),然后把这段字符串作为命令行启动新进程(L15)——简而言之:替代系统的bat文件解释器,附带支持C++的行注释语法。里面有函数、类之类基本语法特性,好懂得很。实际上刚写完的时候只有十几行,全都在__main__里面。我为了玩一下函数调用和面向对象,故意把它拖得又臭又长。

mybat.py
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import subprocess # 井号开头表示注释
import sys # 这三个是加载的其他py文件,类似include。当前这个文件也能被其他py文件加载
import re

# 类定义
class mySubProcess(): # 所有的块级对象(class、def、if、for等等)都用冒号开始,用向后缩进表示包含关系!
    counter = 0 # 所谓的“类变量”,这个类的所有对象持有同一份

    def __init__(self, cmd_string = None): # 对象的构造器(constructor),self是当前对象,支持默认参数
        if cmd_string != None:
            self.cmd_string = cmd_string # 操作对象的私有变量self.cmd_string
            mySubProcess.counter += 1 # 操作类变量

    def run(self):
        subprocess.Popen(self.cmd_string)

    def printSummary(self):
        print 'processed num: %d' %mySubProcess.counter

# 函数定义
def processMybatFile(file_name):
    file_obj = open(file_name, 'r')
    try:
        linetail_pattern = re.compile('\s*\n.*|\s*//.*', re.S) # 正则表达式
        file_lines = file_obj.readlines()
        for line_str in file_lines:
            cmd_str = linetail_pattern.split(line_str.decode('gb2312'))[0].encode('gbk') # 转码
            if len(cmd_str) > 0:
                print '> ' + cmd_str
                a = mySubProcess(cmd_str) # 生成对象
                a.run() # 调用对象
    finally:
        file_obj.close()

    a = mySubProcess() # 使用默认参数生成对象
    a.printSummary()

# 程序入口
if __name__ == '__main__': # 这样写的话,这个块的内容就不会在当前文件被import的时候执行

    if len(sys.argv) == 2:
        cmdfile_name = sys.argv[1:][0]
    else:
        cmdfile_name = 'test.mybat'

    print 'load: ' + cmdfile_name
    processMybatFile(cmdfile_name) # 调用函数

语言本身,总的感觉是有点C++的味道。但是把C++里最晦涩的那坨都扔了。“类变量”比较有特点,用缩进表示block让人厥倒。另外没有变量定义,基本上是变量被赋值的时候决定它的类型,不小心的话,比较容易掉进陷阱。

这个语言很简单,半天时间绝对入门。用它来写写小东西很方便。推荐无聊geek们都来玩玩。


参考资料

分享本文:
Digg del.icio.us Facebook 嘀咕 开心网 校内网 百度搜藏 豆瓣 豆瓣九点 饭否 E-mail this story to a friend! FriendFeed Google Reader Live QQ书签 Twitter
相关文章:0

标签:

11 条评论 发表在“hello Python world”上

  1. luxuan 说:

    前两个月看过一阵子
    翻了本叫做dive into python的书的前两章
    > 英文 http://diveintopython.org
    > 中文 http://www.woodpecker.org.cn/diveintopython/
    窃以为不错

    • 郭胖达 说:

      有乱码,所以稍微编辑了一下原文。
      不错,这本书正好有我想读的python-web方面的内容。多谢了~

  2. cafes 说:

    …你这注释加的太寒了 完全不加也不会影响理解的
    倒是那个正则式非得去那个链接看个半天然后才看懂 lol

  3. xmonkey 说:

    写的果然又臭又长。。。

    俺用python就当作一个支持正则表达式的脚本来用,好像还没用过class.

  4. alma 说:

    惊讶发现居然还记得正则表达式@@…好长啊,看了一半就看不动了。。你周末有啥安排啊

  5. alma 说:

    好吧,那我去逛逛经典景点先!你啥时候夏天再去黄草梁ing,抱大腿~咔咔

  6. Snow.C 说:

    以前都是rss看你的blog, 今天web上来看看, 还是默认theme啊, 你咋不把这嘎达装修一下呢? :D

  7. chanelwang 说:

    你好~其實這篇文章我是完全看不懂的!(我是電腦白痴啊)
    純粹是因為知道貴國網路有強大金盾重重設限
    閣下居然還願意穿過層層流刺網 鑽過壕溝 躲過地雷來造訪我的小格
    非常高興也很感謝!!

    北京八天的自由行真的是豐富又精彩 北京是個非常有文化 有底蘊 值得一再品味的城市!
    我在北京的相簿密碼是 1018
    歡迎您不嫌棄的話來參觀一下囉!

    • 郭胖达 说:

      wretch.cc一直被封锁的。。。哭。。。还好ptt我还能逛。。。。我国政府啊,真是一如既往的伟光正——砌起大墙来毫不留情。。。没办法,人家信奉的是:战争即和平,自由即奴役,无知即力量。再次对他送上中指大礼包一对。。。凸-.-凸

请赐墨宝

*
为了验证您是一个人科动物(不是一个spam留言脚本、超级计算机HAL9000第二代、Vogon人、海藻、肥皂、带wifi的咖啡机、浮云、其他碳基生物及硅基生物),请输入图片中的字符(大小写字母不敏感)。看不清楚,给俺换一张.
Click to hear an audio file of the anti-spam word