urllib.urlopenを呼び出すときのトレース/ BPTトラップ
質問
何らかの理由で、 urllib.urlopen
を呼び出すとTrace / BPTトラップエラーが発生します。 urllib
と urllib2
の両方を試しましたが、結果は同じです。エラーをスローするコードは次のとおりです。
def get_url(url):
from urllib2 import urlopen
if not url or not url.startswith('http://'): return None
return urlopen(url).read() # FIXME!
このコードがweb.pyのあるCherryPyウェブサーバーで実行されていることを追加する必要があります。
誰かがトレースバックを要求しました。残念ながら、何もありません。 Trace / BPT trap
が端末に出力され、プロセスが終了します。例:
dloewenherz@andros project $ sudo ./index.py 80
http://0.0.0.0:80/
# Here I visit the page which contains the get_url(url) method
Trace/BPT trap
dloewenherz@andros project $
編集:OS X 10.6.2、web.py 0.33、Python 2.6.2、CherryPy 3.1.2を実行しています。
解決
メインファイルの先頭に次の行を追加すると、問題が解決しました。
import urllib2
urllib2.install_opener(urllib2.build_opener())
つまり、urllib2モジュールをインポートするだけでは十分ではありませんが、実際にはメインスレッドでオープナーを作成する必要があります。
他のヒント
OS X 10.6でこれを実行していますか?どうやら、スレッドと初めてモジュールをインポートすることは、そこではうまく機能しません。スレッドの外部でurllib2をインポートできないかどうかを確認しますか?
次のスレッドにはさらに詳細があります: Trace / BPT trap Pythonスレッドモジュールを使用
urllibのインポートを同じファイルの先頭に移動するか、スレッドでモジュールを初めてインポートする場合にのみ問題になるようであるため、他の場所にもインポートします。 main()関数と同じファイルに。
編集: OS X、Python、CherryPy、web.pyのどのバージョンを実行していますか? OS X 10.5.8、Python 2.6、CherryPy 3.1.2、web.py 0.33を使用していますが、以下のコードを使用して問題を再現することはできません。
import web
urls = (
'/', 'index'
)
app = web.application(urls, globals())
class index:
def GET(self):
from urllib2 import urlopen
return urlopen("http://google.se/").read()
if __name__ == "__main__": app.run()
$ sudo python index.py 80
http://0.0.0.0:80/
127.0.0.1:59601 - - [08/Nov/2009 09:46:40] "HTTP/1.1 GET /" - 200 OK
127.0.0.1:59604 - - [08/Nov/2009 09:46:40] "HTTP/1.1 GET /extern_js/f/CgJzdhICc2UgACswCjhBQB0sKzAOOAksKzAYOAQsKzAlOMmIASwrMCY4BSwrMCc4Aiw/dDWkSd2jmF8.js" - 404 Not Found
127.0.0.1:59601 - - [08/Nov/2009 09:46:40] "HTTP/1.1 GET /logos/elmo-hp.gif" - 404 Not Found
127.0.0.1:59601 - - [08/Nov/2009 09:46:40] "HTTP/1.1 GET /images/nav_logo7.png" - 404 Not Found
このコードはあなたの側で問題を再現するのに十分ですか?そうでない場合、私は助けになるためにより多くの情報が必要です。