ImportError: cannot import name RAND_egd

ImportError: cannot import name RAND_egd

我尝试使用 py2exe 创建一个 exe 文件。我最近将 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

它可能可以通过更改 setup.py 文件中的 options 来修复,但我不知道我必须在那里写什么。我已经尝试 options = {'py2exe': {'packages': ['requests','urllib2']}}) 但没有成功。

它作为 Python 脚本而不是 exe。

有人知道该怎么做吗?

编辑:

我试图将此导入放入 setup.py 文件中:from _ssl import RAND_egd 并且说不能导入。

编辑 2:Setup.py:

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

根据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 - exceptpass 所以不应该引发错误但它帮助我成功 运行 exe 文件。

编辑:警告:我不知道它是否会导致一些问题。我还没有遇到任何问题。

遇到了同样的问题。

通过删除由 py2exe 创建的目录 'dist' 和 'build' 解决了这个问题,而在以前的 Python 版本中它是 运行。

似乎py2exe 并没有每次都重建所有文件。并且显然没有注意到 Python 版本更改的事实。

最后,您的 'dist' 目录中混合了使用不同版本的 Python 生成的文件。

我的setup.py很简单:

from distutils.core import setup import py2exe

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

我找到了解决方法。这可能是由 socket.pyc.

的旧版本引起的

我的解决方案是编辑 socket.py,在任意位置添加 space 然后删除。然后 运行 你的 setup.py 再次生成新的 socket.pyc.

现在问题已经解决了。

在我的案例中,问题出在 Python27 的两个安装中:x86 和 x64。 %PATH% 中只有 x86 版本,但 pip 安装脚本出于某种原因正在使用 x64 安装中的文件。解决方案是:删除 x64,因为我真的不需要它。

我刚刚删除了 c:\Python27\lib 下的 socket.pyc,然后又删除了 运行 py2exe。错误消失了。

我已将 python 版本从 2.7.12 更改为 2.7.9,问题消失了。

它将替换 python 文件,但让您的包保持原样。

祝你好运。