Trace / piège BPT lors de l’appel urllib.urlopen
Question
Pour une raison quelconque, je reçois une erreur d'interruption Trace / BPT lors de l'appel de urllib.urlopen
. J'ai essayé à la fois urllib
et urllib2
avec des résultats identiques. Voici le code qui lève l'erreur:
def get_url(url):
from urllib2 import urlopen
if not url or not url.startswith('http://'): return None
return urlopen(url).read() # FIXME!
Je dois ajouter que ce code est exécuté sur un serveur Web CherryPy avec web.py.
Quelqu'un a demandé une trace. Malheureusement, il n'y en a pas. La trappe / trace BPT
est transmise au terminal et le processus se termine. Ex.
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 $
Éditer: J'utilise OS X 10.6.2, web.py 0.33, Python 2.6.2 et CherryPy 3.1.2.
La solution
L'ajout des lignes suivantes en haut du fichier principal a résolu le problème:
import urllib2
urllib2.install_opener(urllib2.build_opener())
En d'autres termes, il ne suffit pas d'importer le module urllib2 mais vous devez en fait créer le programme d'ouverture dans le thread principal.
Autres conseils
Utilisez-vous cette application sous OS X 10.6? Apparemment, les threads et les modules importés pour la première fois ne fonctionnent pas bien ensemble. Voyez si vous ne pouvez pas importer urllib2 en dehors du fil?
Le fil suivant contient quelques détails supplémentaires: Trace / BPT trap avec le module de threading Python
Je voudrais essayer de déplacer l'importation d'urllib vers le haut du même fichier ou, vu que cela semble poser un problème uniquement lors de l'importation d'un module pour la première fois dans un thread, importez-le ailleurs, comme dans le même fichier que votre fonction main ().
Modifier: Quelles versions d'OS X, Python, CherryPy et web.py utilisez-vous? J'utilise OS X 10.5.8, Python 2.6, CherryPy 3.1.2 et web.py 0.33. Je ne peux pas reproduire votre problème à l'aide du code ci-dessous:
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
Ce code est-il suffisant pour reproduire le problème de votre côté? Sinon, j'ai besoin de plus d'informations pour pouvoir vous aider.