ImportError: невозможно импортировать имя RAND_egd

Я попытался создать exe файл с помощью py2exe. Недавно я обновил Python с 2.7.7 до 2.7.10, чтобы иметь возможность работать с requests - proxies.

Перед обновлением все сработало нормально, но теперь файл exe недавно создан, что вызвало эту ошибку:

    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

Вероятно, его можно восстановить, изменив options в файле setup.py, но я не могу понять, что мне там нужно написать. Я пробовал options = {'py2exe': {'packages': ['requests','urllib2']}}), но без успеха.

Он работает как Python script, но не как exe.

Кто-нибудь знает, что делать?

ИЗМЕНИТЬ:

Я попытался вставить в файл setup.py этот импорт: from _ssl import RAND_egd и он говорит, что его нельзя импортировать.

EDIT2: Setup.py:

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

Ответ 1

По словам Google, это кажется очень редкой ошибкой. Я не знаю точно, что не так, но я нашел обходной путь для этого, поэтому, если кто-то сталкивается с этой проблемой, возможно, этот ответ помогает.

Перейдите в socket.py файл и выполните поиск RAND_egd. В моем случае есть блок кода (67-я строка):

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

Все, что вам нужно сделать, это прокомментировать 5 строк:

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

Я не знаю, почему он вызывает ImportError, потому что есть блок try - except с pass, поэтому ошибка не должна подниматься, но это помогло мне успешно запустить файл exe.

РЕДАКТИРОВАТЬ: ПРЕДУПРЕЖДЕНИЕ: Я не знаю, может ли это вызвать некоторые проблемы. Я еще не испытывал проблем.

Ответ 2

Опытная та же проблема.

Решила проблему, удалив каталоги 'dist' и 'build', созданные py2exe, когда она была запущена в предыдущей версии Python.

Кажется, что py2exe не перестраивает все файлы каждый раз. И, очевидно, не понимает факт изменения версии Python.

Наконец, у вас есть набор файлов, сгенерированных с различными версиями Python в вашем каталоге dist.

Моя setup.py довольно проста:

из distutils.core import setup import py2exe

Настройка (консоль = [ 'xxxxxx.py'])

Ответ 3

В моем случае проблема была в двух установках Python27: x86 и x64. Только версия x86 была в% PATH%, но установка pip script по какой-то причине использовала файлы из установки x64. Решение было: удалить x64, потому что мне это действительно не нужно.

Ответ 4

Я нашел способ решить эту проблему. Это может быть вызвано старой версией socket.pyc.

Мои решения - это edit socket.py, добавьте пробел в любом месте и затем удалите. А затем запустите ваш setup.py снова, который будет генерировать новый socket.pyc.

Теперь проблема решена.

Ответ 5

Я просто удаляю socket.pyc под c:\Python27\lib и снова запускаю py2exe. Ошибка исчезла.

Ответ 6

Я изменил версию python с 2.7.12 до 2.7.9 и проблема исчезла.

Он заменит файлы python, но оставит вам пакеты как есть.

Удачи.