免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5010 | 回复: 6
打印 上一主题 下一主题

【已解决】Python抓取Windows进程脚本错误问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-20 18:08 |只看该作者 |倒序浏览
本帖最后由 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[v]:            
                log = NOW+'  '+list[v]+'\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[v]:            
            log = NOW+'  '+list[v]+'\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()
   

论坛徽章:
0
2 [报告]
发表于 2014-06-20 20:25 |只看该作者
  1.     NOW=time.strftime('%Y-%m-%d_%H:%M',time.localtime(time.time()))
  2.     log=NOW
复制代码
except里的
log = NOW+'  No process\n'
没执行吧

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
3 [报告]
发表于 2014-06-20 21:56 |只看该作者
回复 1# c386
两个问题
1. PROCESSNAME参数没有在函数中使用,应当把它移除
2. 你的代码:
        getallporcesses(PROCESSNAME)
        getprocess(list)
其中,假定你期望list是得到的进程列表,但是你至少需要赋值一下吧?
或者,赋值也不打算用,那你也要把函数级联调用吧?
getprocess(getallprocesses())

论坛徽章:
0
4 [报告]
发表于 2014-06-20 22:34 |只看该作者
whitelotus19 发表于 2014-06-20 20:25
except里的
log = NOW+'  No process\n'
没执行吧


是的!
当我把进程名字换成列表里没有的名字时候,运行脚本报错

UnboundLocalError: local variable 'log' referenced before assignment

应该是变量Log没赋值
但是不知道为什么没执行,是我这样用try嵌套for判断不行吗?

论坛徽章:
0
5 [报告]
发表于 2014-06-20 22:58 |只看该作者
本帖最后由 c386 于 2014-06-20 22:58 编辑
icymirror 发表于 2014-06-20 21:56
回复 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[v]:            
                log = NOW+'  '+list[v]+'\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()

论坛徽章:
0
6 [报告]
发表于 2014-06-21 07:35 来自手机 |只看该作者
只是循环没有匹配结果,并没补获到异常吧。在循环后做个判断或在循环前给变量赋个初值。

论坛徽章:
0
7 [报告]
发表于 2014-06-21 15:29 |只看该作者
whitelotus19 发表于 2014-06-21 07:35
只是循环没有匹配结果,并没补获到异常吧。在循环后做个判断或在循环前给变量赋个初值。


谢谢指点!
问题确实出在这里,循环没有匹配到结果也是正常的状态,并不能当做异常来处理。
按您说的修改了代码,成功了!
谢谢!

修改后:

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[v]:            
            log = NOW+'  '+list[v]+'\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()
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP