Traccia Traccia / BPT quando si chiama urllib.urlopen
Domanda
Per qualche motivo sto ricevendo un errore trap Trace / BPT quando si chiama urllib.urlopen
. Ho provato sia urllib
che urllib2
con risultati identici. Ecco il codice che genera l'errore:
def get_url(url):
from urllib2 import urlopen
if not url or not url.startswith('http://'): return None
return urlopen(url).read() # FIXME!
Dovrei aggiungere che questo codice è in esecuzione su un server Web CherryPy con web.py.
Qualcuno ha richiesto un traceback. Sfortunatamente non ce n'è. Traccia / trap BPT
viene inviato al terminale e il processo termina. Per es.
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 $
Modifica: sto eseguendo OS X 10.6.2, web.py 0.33, Python 2.6.2 e CherryPy 3.1.2.
Soluzione
L'aggiunta delle seguenti righe all'inizio del file principale ha risolto il problema:
import urllib2
urllib2.install_opener(urllib2.build_opener())
In altre parole, non è sufficiente importare il modulo urllib2 ma in realtà è necessario creare l'apri nel thread principale.
Altri suggerimenti
Lo stai eseguendo su OS X 10.6? Apparentemente i thread e l'importazione dei moduli per la prima volta non giocano bene insieme lì. Vedi se non riesci a importare urllib2 al di fuori del thread?
Ci sono alcuni dettagli in più nella seguente discussione: Trace / BPT trap con il modulo di threading Python
Proverei a spostare l'importazione di urllib nella parte superiore dello stesso file o, dato che sembra essere un problema solo con l'importazione di un modulo per la prima volta in un thread, importarlo anche da qualche altra parte, come nello stesso file della funzione main ().
Modifica: Quali versioni di OS X, Python, CherryPy e web.py stai utilizzando? Sto usando OS X 10.5.8, Python 2.6, CherryPy 3.1.2 e web.py 0.33 e non riesco a riprodurre il tuo problema usando il codice seguente:
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
Questo codice è sufficiente per riprodurre il problema da parte tua? In caso contrario, ho bisogno di ulteriori informazioni per essere di aiuto.