Ловушка трассировки/BPT при вызове urllib.urlopen

По какой-то причине я получаю сообщение об ошибке ловушки Trace/BPT при вызове 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.


person dwlz    schedule 27.10.2009    source источник
comment
Было бы полезно, если бы вы добавили часть трассировки.   -  person Omnifarious    schedule 27.10.2009


Ответы (2)


Добавление следующих строк в начало основного файла решило проблему:

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

Другими словами, недостаточно импортировать модуль urllib2, нужно создать открывалку в основном потоке.

person udibr    schedule 12.11.2009
comment
Кроме того, я не могу отметить это как ответ. Кто-нибудь может помочь? - person dwlz; 14.11.2009
comment
Похоже, проблема с потоками в Snow Leopard вызвана загрузкой CoreFoundation в фоновом потоке. Подробнее здесь: stackoverflow.com/questions/1540835/ - person Nick Farina; 29.11.2009

Вы используете это под 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

Достаточно ли этого кода, чтобы воспроизвести проблему с вашей стороны? Если нет, мне нужно больше информации, чтобы помочь.

person lemonad    schedule 27.10.2009
comment
Да, у меня 10.6.1. Как мне импортировать модуль вне потока? - person dwlz; 27.10.2009
comment
Не зная, как выглядит остальная часть файла, я бы попытался переместить оператор импорта из get_url() в начало файла. - person lemonad; 27.10.2009
comment
Просто переместил оператор импорта наверх. До сих пор нет кости. - person dwlz; 01.11.2009
comment
У вас есть только один файл Python или несколько? Если у вас их несколько, какой из них содержит вашу функцию main()? Это тот же самый, на который вы переместили оператор импорта в начало? Если нет, также добавьте оператор импорта в файл, содержащий вашу функцию main(). - person lemonad; 01.11.2009
comment
Я продолжу и попытаюсь также импортировать модуль в файл index.py. Я дам обновление, когда я это сделаю. - person dwlz; 02.11.2009
comment
Абсолютно никакой разницы. Все равно вылетает. - person dwlz; 08.11.2009
comment
Вставьте полученное исключение. - person Geo; 08.11.2009
comment
@John Geo: К сожалению, решение этой проблемы не дает информации об исключении. - person lemonad; 08.11.2009
comment
Кажется, ubidr ответил на вопрос. Спасибо хоть! - person dwlz; 14.11.2009