调用urllib.urlopen时出现Trace/BPT陷阱

2 投票
2 回答
2384 浏览
提问于 2025-04-15 15:24

出于某种原因,当我调用 urllib.urlopen 时,出现了一个叫做 Trace/BPT trap 的错误。我尝试过 urlliburllib2,结果都是一样的。下面是导致错误的代码:

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模块是不够的,你还需要在主线程中创建一个打开器。

撰写回答