最近一个项目中用gulp-watch不能满足需求,于是想到了用Python来解决问题。在安装了MacFSEvents模块后,写了下面一个小程序。

#!/usr/bin/env python2
#-*- coding: utf-8 -*-

import os,sys,signal                    
from   fsevents import Observer
from   fsevents import Stream  

def callback(FileEvent):
    # attributes of FileEvent:mask, cookie and name.
    # mask: 512-delete;256-create;2-changed
    if FileEvent.name.endswith("index.html") and FileEvent.mask == 256:
        print "site rebuild. redeploy extra assets"
        os.system("gulp")
    elif FileEvent.name.endswith(".scss") and FileEvent.mask == 2:
        print "scss changed! compile and redeploy extra assets"
        os.system("gulp sass")

if __name__ == '__main__':
    observer  = Observer()
    stream    = Stream(callback, ".", file_events=True)
    observer.schedule(stream)
    observer.start()  
    #按Control+\强制结束
 

    但是运行时发现只能用Control+\强杀进程,而不能用Control+C结束。

    经google搜索及自行研究结果,得到下面这段程序。用fork子进程的方法,使得进程响应Control+C 退出。

 1 #!/usr/bin/env python2
 2 #-*- coding: utf-8 -*-
 3 
 4 import os,sys,signal                    
 5 from   fsevents import Observer
 6 from   fsevents import Stream  
 7 
 8 def callback(FileEvent):
 9     # attributes of FileEvent:mask, cookie and name.
10     # mask: 512-delete;256-create;2-changed;...
11     if FileEvent.name.endswith("index.html") and FileEvent.mask == 256:
12         print "site rebuild. redeploy extra assets"
13         os.system("gulp")
14     elif FileEvent.name.endswith(".scss") and FileEvent.mask == 2:
15         print "scss changed! compile and redeploy extra assets"
16         os.system("gulp sass")
17 
18 def child():
19     observer  = Observer()
20     stream    = Stream(callback, ".", file_events=True)
21     observer.schedule(stream)
22     observer.start()
23 
24 class Watcher:  
25     """ 
26      创建一个做苦工的子进程。然后父进程等待
KeyboardInterrupt并杀掉子进程。
27
28 """ 29 30 def __init__(self): 31 self.child = os.fork() 32 if self.child == 0: 33 child() 34 else: 35 self.watch() 36 37 def watch(self): 38 try: 39 os.wait() 40 except KeyboardInterrupt: 41 #捕获 Control+C,杀掉子进程 42 print 'KEYBOARDINTERRUPT\n' 43 self.kill() 44 sys.exit() 45 46 def kill(self): 47 try: 48 os.kill(self.child, signal.SIGKILL) 49 except OSError: pass 50 51 52 if __name__ == '__main__': 53 Watcher()

 

posted on 2016-05-31 16:43  玛瑙河  阅读(1139)  评论(0编辑  收藏  举报