みんなのPythonのサンプルコードは動かない。
ふー疲れた・・・・なんなんだこの本は。 ちなみにウチの実行環境はPython2.5。これが原因か?そんなこともないだろう。もっと根本的。
今日ハマったのはThreadのサンプルコード
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#以下のURLからコピー
#http://coreblog.org/ats/stuff/minpy_support/samplecodes/threadedhttpserver.py/view
from BaseHTTPServer import *
from SimpleHTTPServer import *
from threading import Thread
class ThreadedHTTPServer(Thread):
def __init__(self, port=8080, **kwargs):
""" Thread対応サーバオブジェクトの初期化
"""
self.httpd = HTTPServer(("",port),
SimpleHTTPRequestHandler)
self.httpd_running = False
Thread.__init__(self)
def run(self):
""" スレッドのコードを実行
"""
self.httpd_running = True
while self.httpd_running:
self.httpd.handle_request()
del self.httpd
def stop(self):
""" スレッドの実行を停止するためフラグを立てる
"""
self.httpd_running = False
これを実行する、すると、どうだ?
スレッドが終了しないんだな。
>>> s = ThreadedHTTPServer()
>>> s.start()
>>> s.stop()
>>> s.start()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python\lib\threading.py", line 428, in start
assert not self.__started, "thread already started"
AssertionError: thread already started
>>>s.stop()
>>>s.isAlive()
True
>>>スレッドを破棄してから、再度スレッドをRun出来ない。つまりSTOP()関数がまるで動作していない。isAlive()で調べてやると、True。つまりスレッドは終了されてない。
なんで?バグ?それとも、バージョン違い?スレッド破棄されてない。スレッドの紹介になってない。こまるよ。3000円もするんだから。しっかりしてよ。正誤表にもあがってねぇ。
昨日は、Sqliteのサンプルコードが文字コードの処理不十分でエラー。
つーか、ここまで動かないんだと、正直金返せと(言い過ぎ〜)
サンプルコードが動かないんだと、入門書ととしていかがなモノか。Pythonの最新版(2.4以上)をインストールしましょうとかかずに、Python2.4をインストールする必要がありますとか書いてる方が良いんじゃない?
追記)
みんなのPythonをよく読み直してみると、スレッドの終了処理は適当です〜みたいなことが書いてあった、なるほど、俺が突っ込んだのが馬鹿だったわけだ。
まぁスレッドって高度だからごめんね、入門書だからってことか。それでも、きっちりスレッドの終了処理は書いておくべきかと思うよ。補注なり、脚注をつかって。Appendixでもいいし。いい加減とはっきり書いちゃうのは、どうなんだろう。