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はジェネレーター関数を定義するときにのみ使用され、ジェネレーター関数が呼び出されると、ジェネレーターと呼ばれるイテレーターを返します。次に、そのジェネレーターはジェネレーター関数の実行を制御します。ジェネレータのメソッドの1つが呼び出されると、実行が開始されます。

ジェネレーターメソッド(など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
>>> 

Pythonで「yield」キーワードは何をするのかに対する答えとして、yield式の優れた説明があります。。

于 2012-12-23T22:56:05.477 に答える
2

問題を再現できません:

コードを実行すると、次のようになります。

initiating...
running...

これは、run()メソッドが正しく実行されることを示しています。

コードの上にスレッドモジュールを正しくインポートしましたか?

import threading
于 2012-12-23T22:24:56.547 に答える