调用urllib.urlopen时出现Trace/BPT陷阱
出于某种原因,当我调用 urllib.urlopen
时,出现了一个叫做 Trace/BPT trap 的错误。我尝试过 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!
我还要补充一下,这段代码是在 CherryPy 的 webserver 上运行的,使用的是 web.py。
有人请求查看错误追踪信息。很遗憾,没有任何追踪信息。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。
2 个回答
2
你是在用 OS X 10.6 吗?听说在这个系统上,线程和第一次导入模块不太兼容。你可以试试在线程外导入 urllib2 吗?
下面的讨论里有更多细节:Trace/BPT trap with Python threading module
我建议你把 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
这段代码能在你那边重现问题吗?如果不能,我需要更多信息才能帮到你。
3
在主文件的顶部添加以下几行代码解决了这个问题:
import urllib2
urllib2.install_opener(urllib2.build_opener())
换句话说,光导入urllib2模块是不够的,你还需要在主线程中创建一个打开器。