出于某种原因,我在调用 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 输出到终端,进程终止。 E.g。

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?

以下主题中还有一些细节:跟踪/ BPT陷阱使用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

此代码是否足以重现您的问题?如果没有,我需要更多信息才能提供帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top