【已解决】Python抓取Windows进程脚本错误问题
本帖最后由 c386 于 2014-06-21 15:32 编辑写了一个抓Windows进程的脚本
首先使用tasklist命令列出所有Windows进程并read到list里
然后遍历列表list元素,如果有元素字段内包含"Proxy.exe"字段,则把该字段和时间一起记录到d:\ProxyLog.txt中
现在问题是,当list中没有该匹配字段时,程序会报错,而且没有任何记录
自己查了半天,也找不出个为什么。
各位大大帮忙看一下,这个脚本到底是哪里出了问题呢?
import os,sys,time
PROCESSNAME="ProxyLog.exe"
f=file(r'd:\ProxyLog.txt','a+')
def getallporcesses():
command = 'tasklist'
list=os.popen(command).read().split('\n')
return list
def getprocess(list):
NOW=time.strftime('%Y-%m-%d_%H:%M:%S',time.localtime(time.time()))
try:
for v in range(0,len(list)):
if PROCESSNAME in list:
log = NOW+''+list+'\n'
f.write(log)
break
except:
log = 'No process\n'
f.write(log)
finally:
print log
f.flush()
def main():
while(1):
getprocess(getallporcesses())
time.sleep(10)
if __name__ == "__main__":
main()
多谢大家指点!
问题就出在异常处理上。
循环没有匹配到结果也是正常状态,并不能当做异常来处理。这里是自己理解有问题,汗一个。
实现代码:
import os,sys,time
PROCESSNAME="cmd.exe" #要捕获的进程名
f=file(r'd:\ProxyLog.txt','a+') #要写入的文件
def getallporcesses():
command = 'tasklist'
list=os.popen(command).read().split('\n')
return list
def getprocess(list):
NOW=time.strftime('%Y-%m-%d_%H:%M:%S',time.localtime(time.time()))
for v in range(0,len(list)):
pos=-1
if PROCESSNAME in list:
log = NOW+''+list+'\n'
f.write(log)
pos=v
break;
else:
pass;
if ( pos==-1):
log = NOW+'No Process!\n'
f.write(log)
def main():
while(1):
getprocess(getallporcesses())
f.flush()
time.sleep(10)
if __name__ == "__main__":
main()
NOW=time.strftime('%Y-%m-%d_%H:%M',time.localtime(time.time()))
log=NOWexcept里的
log = NOW+'No process\n'
没执行吧 回复 1# c386
两个问题
1. PROCESSNAME参数没有在函数中使用,应当把它移除
2. 你的代码:
getallporcesses(PROCESSNAME)
getprocess(list)
其中,假定你期望list是得到的进程列表,但是你至少需要赋值一下吧?
或者,赋值也不打算用,那你也要把函数级联调用吧?
getprocess(getallprocesses()) whitelotus19 发表于 2014-06-20 20:25 static/image/common/back.gif
except里的
log = NOW+'No process\n'
没执行吧
是的!
当我把进程名字换成列表里没有的名字时候,运行脚本报错
UnboundLocalError: local variable 'log' referenced before assignment
应该是变量Log没赋值
但是不知道为什么没执行,是我这样用try嵌套for判断不行吗?
本帖最后由 c386 于 2014-06-20 22:58 编辑
icymirror 发表于 2014-06-20 21:56 static/image/common/back.gif
回复 1# c386
两个问题
1. PROCESSNAME参数没有在函数中使用,应当把它移除
谢谢指点!
按照您指出的错误修改了代码,但是问题还是存在。当进程不存在时,执行还是一直卡在try下边的for循环里,走不到except那一步。是否不能用这样的写法来判断呢?
修改后:
import os,sys,time
PROCESSNAME="ProxyLog.exe"
f=file(r'd:\ProxyLog.txt','a+')
def getallporcesses():
command = 'tasklist'
list=os.popen(command).read().split('\n')
return list
def getprocess(list):
NOW=time.strftime('%Y-%m-%d_%H:%M:%S',time.localtime(time.time()))
try:
for v in range(0,len(list)):
if PROCESSNAME in list:
log = NOW+''+list+'\n'
f.write(log)
break
except:
log = 'No process\n'
f.write(log)
finally:
print log
f.flush()
def main():
while(1):
getprocess(getallporcesses())
time.sleep(10)
if __name__ == "__main__":
main() 只是循环没有匹配结果,并没补获到异常吧。在循环后做个判断或在循环前给变量赋个初值。 whitelotus19 发表于 2014-06-21 07:35 static/image/common/back.gif
只是循环没有匹配结果,并没补获到异常吧。在循环后做个判断或在循环前给变量赋个初值。
谢谢指点!
问题确实出在这里,循环没有匹配到结果也是正常的状态,并不能当做异常来处理。
按您说的修改了代码,成功了!
谢谢!
修改后:
import os,sys,time
PROCESSNAME="cmd.exe"
f=file(r'd:\ProxyLog.txt','a+')
def getallporcesses():
command = 'tasklist'
list=os.popen(command).read().split('\n')
return list
def getprocess(list):
NOW=time.strftime('%Y-%m-%d_%H:%M:%S',time.localtime(time.time()))
for v in range(0,len(list)):
pos=-1
if PROCESSNAME in list:
log = NOW+''+list+'\n'
f.write(log)
pos=v
break;
else:
pass;
if ( pos==-1):
log = NOW+'No Process!\n'
f.write(log)
def main():
while(1):
getprocess(getallporcesses())
f.flush()
time.sleep(10)
if __name__ == "__main__":
main()
页:
[1]