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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top