c386 发表于 2014-06-20 18:08

【已解决】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()
   

whitelotus19 发表于 2014-06-20 20:25

    NOW=time.strftime('%Y-%m-%d_%H:%M',time.localtime(time.time()))
    log=NOWexcept里的
log = NOW+'No process\n'
没执行吧

icymirror 发表于 2014-06-20 21:56

回复 1# c386
两个问题
1. PROCESSNAME参数没有在函数中使用,应当把它移除
2. 你的代码:
      getallporcesses(PROCESSNAME)
      getprocess(list)
其中,假定你期望list是得到的进程列表,但是你至少需要赋值一下吧?
或者,赋值也不打算用,那你也要把函数级联调用吧?
getprocess(getallprocesses())

c386 发表于 2014-06-20 22:34

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

本帖最后由 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

只是循环没有匹配结果,并没补获到异常吧。在循环后做个判断或在循环前给变量赋个初值。

c386 发表于 2014-06-21 15:29

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]
查看完整版本: 【已解决】Python抓取Windows进程脚本错误问题