forked from logzhan/RobotHardware-UESTC
235 lines
7.1 KiB
Python
235 lines
7.1 KiB
Python
#!/usr/bin/python
|
||
# -*- coding: utf-8 -*-
|
||
import os, sys, inspect
|
||
import datetime
|
||
import signal
|
||
import threading
|
||
import time
|
||
# function: get directory of current script, if script is built
|
||
# into an executable file, get directory of the excutable file
|
||
def current_file_directory():
|
||
path = os.path.realpath(sys.path[0]) # interpreter starter's path
|
||
if os.path.isfile(path): # starter is excutable file
|
||
path = os.path.dirname(path)
|
||
path = os.path.abspath(path) # return excutable file's directory
|
||
else: # starter is python script
|
||
caller_file = inspect.stack()[0][1] # function caller's filename
|
||
path = os.path.abspath(os.path.dirname(caller_file))# return function caller's file's directory
|
||
if path[-1]!=os.path.sep:path+=os.path.sep
|
||
return path
|
||
|
||
"""格式化字符串"""
|
||
def formatString(string,*argv):
|
||
string=string%argv
|
||
if string.find('$(scriptpath)')>=0:
|
||
string=string.replace('$(scriptpath)',current_file_directory())
|
||
if string.find('$(filenumber2)')>=0:
|
||
i=0
|
||
path=""
|
||
while True:
|
||
path=string.replace('$(scriptpath)',"%02d"%i)
|
||
if not os.path.lexists(path):break
|
||
i+=1
|
||
string=path
|
||
#8位日期(20140404)
|
||
if string.find('$(Date8)')>=0:
|
||
now=datetime.datetime.now()
|
||
string=string.replace('$(Date8)', now.strftime("%Y%m%d"))
|
||
#6位日期(140404)
|
||
if string.find('$(Date6)')>=0:
|
||
now=datetime.datetime.now()
|
||
string=string.replace('$(Date6)', now.strftime("%y%m%d"))
|
||
#6位时间(121212)
|
||
if string.find('$(Time6)')>=0:
|
||
now=datetime.datetime.now()
|
||
string=string.replace('$(Time6)', now.strftime("%H%M%S"))
|
||
#4位时间(1212)
|
||
if string.find('$(Time4)')>=0:
|
||
now=datetime.datetime.now()
|
||
string=string.replace('$(Time4)', now.strftime("%H%M"))
|
||
#文件编号2位(必须在最后)
|
||
if string.find('$(filenumber2)')>=0:
|
||
i=0
|
||
path=""
|
||
while True:
|
||
path=string.replace('$(filenumber2)',"%02d"%i)
|
||
if not os.path.lexists(path):break
|
||
i+=1
|
||
string=path
|
||
#文件编号3位(必须在最后)
|
||
if string.find('$(filenumber3)')>=0:
|
||
i=0
|
||
path=""
|
||
while True:
|
||
path=string.replace('$(filenumber3)',"%03d"%i)
|
||
if not os.path.lexists(path):break
|
||
i+=1
|
||
string=path
|
||
return string
|
||
|
||
"""
|
||
取得进程列表
|
||
格式:(PID,cmd)
|
||
"""
|
||
def getProcessList():
|
||
processList = []
|
||
try:
|
||
for line in os.popen("ps xa"):
|
||
fields = line.split()
|
||
# spid = fields[0]
|
||
pid = 0
|
||
try:pid = int(fields[0])
|
||
except:None
|
||
cmd = line[27:-1]
|
||
# print "PS:%d,%s"%(npid,process)
|
||
if pid != 0 and len(cmd) > 0:
|
||
processList.append((pid, cmd))
|
||
except Exception as e:
|
||
print("getProcessList except:%s" % (e))
|
||
return processList
|
||
def killCommand(cmd):
|
||
try:
|
||
processList = getProcessList()
|
||
for p in processList:
|
||
if p[1].find(cmd) != -1:
|
||
pid = p[0]
|
||
os.kill(pid, signal.SIGKILL)
|
||
except Exception as e:
|
||
print("killCommand ‘%s’ except:%s" % (cmd,e))
|
||
|
||
def check_pid(pid):
|
||
""" Check For the existence of a unix pid. """
|
||
if pid == 0:return False
|
||
try:
|
||
os.kill(pid, 0)
|
||
except OSError:
|
||
return False
|
||
else:
|
||
return True
|
||
|
||
SF=formatString
|
||
|
||
#全局异常捕获
|
||
def excepthook(excType, excValue, tb):
|
||
'''''write the unhandle exception to log'''
|
||
from log import log
|
||
import traceback
|
||
log.e('Unhandled Error: %s',''.join(traceback.format_exception(excType, excValue, tb)))
|
||
sys.exit(-1)
|
||
#sys.__excepthook__(type, value, trace)
|
||
#sys.__excepthook__(excType, excValue, tb)
|
||
|
||
_defaultGlobalExcept=sys.excepthook
|
||
|
||
def enableGlobalExcept(enable=True):
|
||
if enable:
|
||
sys.excepthook = excepthook
|
||
else:
|
||
sys.excepthook=_defaultGlobalExcept
|
||
# 默认启动全局异常处理
|
||
enableGlobalExcept()
|
||
#创建线程
|
||
def createThread(name,target,args=(),autoRun=True,daemon=True):
|
||
from log import log
|
||
def threadProc():
|
||
log.i("thread %s started!",name)
|
||
try:
|
||
target(*args)
|
||
log.i("thread %s ended!",name)
|
||
except Exception as e:
|
||
log.e("thread %s crash!err=%s",name,e)
|
||
thd=threading.Thread(name=name,target=threadProc)
|
||
thd.setDaemon(daemon)
|
||
if autoRun:thd.start()
|
||
return thd
|
||
|
||
|
||
#定时器
|
||
class Timer():
|
||
def __init__(self, timer_proc, args=(),first=0,period=0,name="Timer"):
|
||
self.name=name
|
||
self.first=first
|
||
self.period=period
|
||
self.args=args
|
||
self.timer_proc=timer_proc
|
||
self.thdWork=None
|
||
self.stopFlag=False
|
||
from log import NamedLog
|
||
self.log=NamedLog(name)
|
||
def run(self):
|
||
if self.first>0:
|
||
time.sleep(self.first)
|
||
try:
|
||
self.timer_proc(*self.args)
|
||
except Exception as e:
|
||
self.log.error("timer proc crash!err=%s",e)
|
||
while self.period>0 and not self.stopFlag:
|
||
time.sleep(self.period)
|
||
try:
|
||
self.timer_proc(*self.args)
|
||
except Exception as e:
|
||
self.log.error("timer proc crash!err=%s",e)
|
||
def start(self):
|
||
if self.isAlive():
|
||
self.log.d("already running!")
|
||
return True
|
||
self.stopFlag=False
|
||
self.thdWork=threading.Thread(name=self.name,target=self.run)
|
||
self.thdWork.setDaemon(True)
|
||
self.thdWork.start()
|
||
def stop(self,timeout=3):
|
||
if self.isAlive():
|
||
self.stopFlag=True
|
||
try:
|
||
self.thdWork.join(timeout)
|
||
except Exception as e:
|
||
self.log.e("stop timeout!")
|
||
|
||
def isAlive(self):
|
||
return self.thdWork and self.thdWork.isAlive()
|
||
#计时器
|
||
class Ticker():
|
||
def __init__(self):
|
||
self.reset()
|
||
# 片段,可以判断时长是否在一个特定毫秒段内
|
||
self.section=[]
|
||
def reset(self):
|
||
self.tick=time.time()
|
||
self.end=0
|
||
def stop(self):
|
||
self.end=time.time()
|
||
@property
|
||
def ticker(self):
|
||
if self.end==0:
|
||
return int((time.time()-self.tick)*1000)
|
||
else:
|
||
return int((self.end-self.tick)*1000)
|
||
def addSection(self,a,b):
|
||
a,b=int(a),int(b)
|
||
assert a<b
|
||
self.section.append((a,b))
|
||
def removeSection(self,a,b):
|
||
a,b=int(a),int(b)
|
||
self.section.remove((a,b))
|
||
def removeAllSectioin(self):
|
||
self.section=[]
|
||
def inSection(self):
|
||
tick=self.ticker
|
||
for (a,b) in self.section:
|
||
if tick>=a and tick<=b:
|
||
return True
|
||
return False
|
||
def __call__(self):
|
||
return self.ticker
|
||
def waitExit():
|
||
import log
|
||
log.log.i("start waiting to exit...")
|
||
try:
|
||
while(True):
|
||
time.sleep(1)
|
||
except Exception as e:
|
||
log.log.w("recv exit sign!")
|
||
|
||
def is_python3():
|
||
return sys.hexversion > 0x03000000
|