我有一个继承自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()
部分。
答案 0 :(得分:4)
您需要删除该行:
yield line
这导致run()
没有,嗯......跑!它首先出现在那里并不明显。
根据Python Documentation,the yield
expression仅在定义生成器函数时使用,在调用生成器函数时,它返回称为生成器的迭代器。然后该生成器控制生成器函数的执行。 当调用其中一个生成器的方法时,执行开始。
由于您没有调用任何生成器方法(例如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
>>>
有an excellent explanation of the yield expression作为What does the "yield" keyword do in Python?的答案。
答案 1 :(得分:2)
我无法重现这个问题:
当我运行你的代码时,我得到:
initiating...
running...
这表明run()方法确实正确执行。
您是否在代码顶部正确导入了线程模块?
import threading