2015-08-01 24 views
12

Ho provato a creare un file exe usando py2exe. Ho recentemente aggiornato Python dal 2.7.7 al 2.7.10 per poter lavorare con requests - proxies.ImportError: impossibile importare nome RAND_egd

Prima dell'aggiornamento tutto ha funzionato bene, ma ora, il file exe creato di recente, sollevando questo errore:

Traceback (most recent call last): 
    File "puoka_2.py", line 1, in <module> 
    import mLib 
    File "mLib.pyc", line 4, in <module> 
    File "urllib2.pyc", line 94, in <module 
    File "httplib.pyc", line 71, in <module 
    File "socket.pyc", line 68, in <module> 
ImportError: cannot import name RAND_egd 

Si potrebbe probabilmente riparato cambiando options nel file di setup.py, ma io non riesco a capire cosa devo scrivere lì. Ho provato options = {'py2exe': {'packages': ['requests','urllib2']}}) ma senza successo.

Funziona come uno script Python ma non come un exe.

Qualcuno sa cosa fare?

EDIT:

ho cercato di mettere in setup.py file di questa importazione: from _ssl import RAND_egd e dice che non può essere importato.

EDIT2: Setup.py:

from distutils.core import setup 
import py2exe 
# from _ssl import RAND_egd 
setup(
    console=['puoka_2.py'], 
    options = {'py2exe': {'packages': ['requests']}}) 
+3

Questo sembra essere un errore che si verifica solo con python 2.7.10. Ho avuto questo errore e downgrade a Python 2.7.9 risolto. –

risposta

11

Secondo Google, sembra essere un errore molto raro. Non so esattamente cosa c'è che non va, ma ho trovato una soluzione per risolvere il problema, quindi se qualcuno ha riscontrato questo problema, forse questa risposta aiuta.

Passare al file socket.py e cercare RAND_egd. C'è un blocco di codice (linea 67 ° nel mio caso):

from _ssl import SSLError as sslerror 
from _ssl import \ 
    RAND_add, \ 
    RAND_status, \ 
    SSL_ERROR_ZERO_RETURN, \ 
    SSL_ERROR_WANT_READ, \ 
    SSL_ERROR_WANT_WRITE, \ 
    SSL_ERROR_WANT_X509_LOOKUP, \ 
    SSL_ERROR_SYSCALL, \ 
    SSL_ERROR_SSL, \ 
    SSL_ERROR_WANT_CONNECT, \ 
    SSL_ERROR_EOF, \ 
    SSL_ERROR_INVALID_ERROR_CODE 
try: 
    from _ssl import RAND_egd 
except ImportError: 
    # LibreSSL does not provide RAND_egd 
    pass 

Tutto quello che devi fare è di commentare le 5 linee:

#try: 
     #from _ssl import RAND_egd 
    #except ImportError: 
     ## LibreSSL does not provide RAND_egd 
     #pass 

Non so il motivo per cui solleva la ImportError perché c'è un blocco try - except con pass quindi l'errore non dovrebbe essere sollevato ma mi ha aiutato a eseguire correttamente il file exe.

MODIFICA: AVVISO: non so se potrebbe causare alcuni problemi. Non ho ancora avuto problemi.

+0

Errore di fronte durante l'esecuzione di un file eseguibile generato con py2exe. Ha fatto il passo come menzionato, generato eseguibile e funzionava. Sono tornato indietro e hanno decommentato le righe, ho cercato di riprodurre questo errore e non ho potuto. : D –

+0

@JamesJithin Quindi Steve Guo (un'altra risposta) è probabilmente True. Forse è abbastanza per cambiare qualcosa. :) –

+0

Di fronte al tentativo di avviare [app-engine-python dev_appserver.py] di Google Cloud SDK (https://cloud.google.com/appengine/docs/python/tools/using-local-serve) –

2

Esperto lo stesso problema.

Risolto il problema rimuovendo le directory 'dist' e 'build' create da py2exe quando veniva eseguito sulla versione precedente di Python.

Sembra che py2exe non ricostruisca tutti i file ogni volta. E ovviamente non prende atto del fatto che la versione di Python sta cambiando.

Finalmente hai un mix di file generati con diverse versioni di Python nella tua directory 'dist'.

mio setup.py è piuttosto semplice:

from distutils.core import setup import py2exe

setup(console=['xxxxxx.py'])

+0

Conferma questo ha funzionato per me. Puoi anche rinominare dist e costruire cartelle se sei a tutti gli interessati. – SilentSteel

0

ho trovato un modo per risolverlo. Questo potrebbe essere causato dalla vecchia versione di socket.pyc.

Le mie soluzioni sono presa di modifica.py, aggiungi uno spazio ovunque e poi elimina. Quindi esegui di nuovo setup.py che genererà il nuovo socket.pyc.

Ora il problema è risolto.

1

Nel mio caso il problema era in due installazioni di Python27: x86 e x64. Solo la versione x86 era in% PATH%, ma lo script di installazione di pip stava usando i file dall'installazione di x64 per qualche motivo. La soluzione è stata: rimuovere x64, perché non ne ho davvero bisogno.

0

Rimuovere solo socket.pyc in c: \ Python27 \ lib ed eseguire nuovamente py2exe. L'errore è andato.

0

Ho cambiato la versione di Python dal 2.7.12 al 2.7.9 e il problema è andato via.

Sostituirà i file python ma lascerà i pacchetti così come sono.

Buona fortuna.