Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ImportError: cannot import name RAND_egd

I've tried to create an exe file using py2exe. I've recently updated Python from 2.7.7 to 2.7.10 to be able to work with requests - proxies.

Before the update everything worked fine but now, the exe file recently created, raising this error:

    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

It could be probably repaired by changing options in setup.py file but I can't figure out what I have to write there. I've tried options = {'py2exe': {'packages': ['requests','urllib2']}}) but with no success.

It works as a Python script but not as an exe.

Do anybody knows what to do?

EDIT:

I've tried to put into setup.py file this import: from _ssl import RAND_egd and it says that it can't be imported.

EDIT2: Setup.py:

from distutils.core import setup
import py2exe
# from _ssl import RAND_egd
setup(
  console=['puoka_2.py'],
  options = {'py2exe': {'packages': ['requests']}})
like image 338
Milano Avatar asked Aug 01 '15 13:08

Milano


2 Answers

According to Google, it seems to be a very rare Error. I don't know exactly what is wrong but I found a workaround for that so if somebody experiences this problem, maybe this answer helps.

Go to socket.py file and search for RAND_egd. There is a block of code (67th line in my case):

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

Everything what you have to do is to comment the 5 lines:

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

I don't know why it raises the ImportError because there is a try - except block with pass so the error should not being raised but it helped me to successfully run the exe file.

EDIT: WARNING: I don't know whether it could cause some problems. I experienced no problems yet.

like image 111
Milano Avatar answered Sep 29 '22 09:09

Milano


Experienced the same problem.

Solved the problem by removing directories 'dist' and 'build' created by py2exe when it was run on previous version of Python.

Seems like py2exe doesn't rebuild all the files every time. And obviously doesn't catch the fact of Python version changing.

Finally you have a mix of files generated with different versions of Python in your 'dist' directory.

My setup.py is pretty simple:

from distutils.core import setup import py2exe

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

like image 25
eldarko Avatar answered Sep 29 '22 09:09

eldarko