2

出于某种原因,我在调用urllib.urlopen. 我都试过了urlliburllib2结果相同。这是引发错误的代码:

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。

4

2 回答 2

3

将以下行添加到主文件的顶部解决了该问题:

import urllib2
urllib2.install_opener(urllib2.build_opener())

换句话说,仅仅导入 urllib2 模块是不够的,实际上还需要在主线程中创建 opener。

于 2009-11-12T19:00:45.060 回答
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

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

于 2009-10-27T06:32:36.000 回答