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, но оставит вам пакеты как есть.
Удачи.