Trace / BPT trap при вызове urllib.urlopen
Вопрос
По какой-то причине я получаю ошибку Trace / BPT trap при вызове urllib.urlopen
. Я пробовал и 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 с 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.
Решение
Добавление следующих строк в начало основного файла решило проблему:
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
Достаточно ли этого кода, чтобы воспроизвести проблему с вашей стороны? Если нет, мне нужно больше информации, чтобы помочь.