ImportError: 无法导入名称RAND_egd

14

我尝试使用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']}})

3
这似乎是仅在 Python 2.7.10 中发生的错误。我遇到了这个问题,将 Python 降级为 2.7.9 解决了它。 - Niklas Rosencrantz
6个回答

15
根据谷歌,这似乎是一个非常罕见的错误。我不知道具体出了什么问题,但我找到了一个解决方法,所以如果有人遇到这个问题,也许这个答案可以帮助。打开 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文件。

编辑:警告:我不知道这可能会引起一些问题。我还没有遇到过任何问题。


运行使用py2exe生成的可执行文件时遇到了错误。按照说明进行了步骤,生成了可执行文件并且可以正常工作。回头取消注释了几行代码,试图重现这个错误,但是却无法再次出现。 :D - James Jithin
@JamesJithin,所以另一个回答的Steve Guo可能是正确的。也许改变任何东西都足够了 :) - Milano
尝试启动Google Cloud SDK的app-engine-python dev_appserver.py时遇到了问题。 - Nate Anderson

3

遇到了同样的问题。

通过删除之前版本的Python上运行py2exe创建的“dist”和“build”目录来解决问题。

似乎py2exe不会每次重新构建所有文件。显然也无法捕捉到Python版本更改的事实。

最终,“dist”目录中生成了使用不同版本Python生成的文件的混合体。

我的setup.py非常简单:

from distutils.core import setup import py2exe

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


确认这对我起作用了。如果您有任何疑虑,也可以重命名dist和build文件夹。 - SilentSteel

1
在我的情况下,问题出在两个Python27的安装程序上:x86和x64。只有x86版本在%PATH%中,但是pip安装脚本出于某种原因使用了x64安装程序中的文件。解决方法是:删除x64,因为我实际上不需要它。

0

我找到了解决方法。这可能是由于旧版本的socket.pyc引起的。

我的解决方案是编辑socket.py,在任何地方添加一个空格并将其删除。然后再次运行您的setup.py,它将生成新的socket.pyc。

现在问题已经解决。


0

我刚刚在 c:\Python27\lib 下删除了 socket.pyc 文件,然后重新运行了 py2exe。错误已经解决了。


0

我已将Python版本从2.7.12更改为2.7.9,问题已解决。

它将替换Python文件,但保留您的软件包不变。

祝好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接