0

我有一个继承自threading.Thread. 由于某种原因,线程不想启动。

这是我的代码:

import time,threading,re,socket


class PyWatch(threading.Thread):

    filename = ""


    def __init__(self,filename):
        threading.Thread.__init__(self)
        print "initiating..."
        self.filename = filename


     def run(self):
        print "running..."
        thefile = open (self.filename)
        thefile.seek(0,2)      # Go to the end of the file
        while True:
                line = thefile.readline()
                if not line:
                     time.sleep(0.1)    # Sleep briefly
                     continue
                yield line
                self.process(line)


    def process(self,line):
        ip =  self.filterIPFromLine(line)
        print ip                

    def filterIPFromLine(self,line):
        ip = None
        if '/var/ossec/active-response/bin/firewall-drop.sh' in  str( line ).lower():
            ip = re.match( "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])" )

            try:
                socket.inet_aton(ip[0])
                ip = ip[0]
            except socket.error:
                pass
        return ip


tom = PyWatch('example.log')
tom.start()

代码正在运行,它没有返回错误,但由于某种原因它永远不会到达该run()部分。

4

2 回答 2

5

您需要删除该行:

            yield line

这导致run()不,好吧......运行!不清楚为什么它首先存在。

根据Python 文档yield表达式仅在定义生成器函数时使用,当调用生成器函数时,它返回一个称为生成器的迭代器。然后该生成器控制生成器函数的执行。当调用生成器的方法之一时开始执行。

由于您没有调用任何生成器方法(例如next()),因此该函数不会执行。

这是一个快速演示:

Python 2.7.2 (default, Jun 20 2012, 16:23:33) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def fun():
...     print 'Starting'
...     for i in range(10):
...             yield i
... 
>>> fun()
<generator object fun at 0x10678c460>
>>> _.next()
Starting
0
>>> 

对于“ yield ”关键字在 Python 中的作用是什么?.

于 2012-12-23T22:56:05.477 回答
2

我无法重现该问题:

当我运行您的代码时,我得到:

initiating...
running...

这表明 run() 方法确实执行正确。

您是否在代码之上正确导入了线程模块?

import threading
于 2012-12-23T22:24:56.547 回答