2009-10-27 16 views
2

Pour une raison quelconque, j'obtiens une erreur de traçage/trappe BPT lors de l'appel urllib.urlopen. J'ai essayé à la fois urllib et urllib2 avec des résultats identiques. Voici le code qui jette l'erreur:Piège Trace/BPT lors de l'appel de urllib.urlopen

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 en cours d'exécution sur un serveur web CherryPy avec web.py.

Quelqu'un a demandé un retraçage. Malheureusement, il n'y en a pas. Trace/BPT trap est envoyé au terminal et le processus se termine. Par exemple.

[email protected] 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 
[email protected] project $ 

Edit: Je courais OS X 10.6.2, Web.py 0.33, Python 2.6.2 et 3.1.2 CherryPy.

+2

Il serait utile de mettre une partie de la traceback. – Omnifarious

Répondre

3

Ajout des lignes suivantes au début du fichier principal 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 avez réellement besoin pour créer l'ouverture dans la principale fil.

+0

Pourquoi cela est-il nécessaire? –

+0

Aussi, je ne peux pas sembler marquer cela comme la réponse. Quelqu'un peut-il aider? –

+1

Semble être un problème de threading avec Snow Leopard causé par le chargement de CoreFoundation sur un thread d'arrière-plan. Plus d'infos ici: http://stackoverflow.com/questions/1540835/trace-bpt-trap-with-python-threading-module/1547316#1547316 –

2

L'exécutez-vous sous OS X 10.6? Apparemment, les threads et les modules d'importation pour la première fois ne jouent pas bien ensemble. Voyez si vous ne pouvez pas importer urllib2 en dehors du fil?

Il y a quelques détails dans le fil suivant: Trace/BPT trap with Python threading module

Je vais essayer soit déplacer l'importation de urllib vers le haut du même fichier ou, car il semble être un problème uniquement avec 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().

Édition: Quelles versions de OS X, Python, CherryPy et web.py exécutez-vous? J'utilise OS X 10.5.8, Python 2.6, 3.1.2 et CherryPy Web.py 0,33 et ne peut pas reproduire votre problème en utilisant le 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 

Est-ce suffisant code pour reproduire le problème votre fin? Sinon, j'ai besoin de plus d'informations pour être utile.

+0

Oui, je cours 10.6.1. Comment pourrais-je importer le module en dehors du thread? –

+0

Ne sachant pas à quoi ressemble le reste du fichier, j'essayerais de déplacer l'instruction import de get_url() vers le haut du fichier. – lemonad

+0

Il suffit de déplacer la déclaration d'importation vers le haut. Toujours pas de dés. –