【问题标题】:ImportError: No module named _sslImportError:没有名为 _ssl 的模块
【发布时间】:2011-07-04 23:18:37
【问题描述】:

Ubuntu Maverick w/Python 2.7:

我不知道如何解决以下导入错误:

>>> import ssl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/ssl.py", line 60, in <module>
   import _ssl             # if we can't import it, let the error propagate
ImportError: No module named _ssl

更新: 我重新编译了源代码。我无法弄清楚如何在下面提到的答案中添加 --with-ssl 选项,而是通过编辑 /Modules/Setup.dist 中有关 SSL 的行来实现这一点。

【问题讨论】:

标签: python python-2.7


【解决方案1】:

您是否从源代码构建 Python?如果是这样,您在构建时需要--with-ssl 选项。

【讨论】:

  • 我不记得我是否从源代码构建。我什么时候添加--with-ssl? ./configure、make 或 make install 步骤。当我将此添加到 ./configure 时,它​​说 --with-ssl 选项无法识别
  • 这是configure 的一个选项。通常,配置选项、编译时开关等是configure 的选项——它实际上做的是在许多源文件上运行,进行文本替换(并且经常创建新的头文件),之前构建时间。
  • 我尝试安装 Python 2.7 并且 --with-ssl 似乎不再被识别...
  • 忽略互联网上的其他建议,它已经过时了。扩展构建现在由 setup.py 控制。破解该文件,不要触摸 Modules/Setup.dist 或 --with-ssl。
  • 从源代码构建时不再需要--with-ssl,因为它会默认查找 ssl。确保您安装了openssl-devellibssl-dev(名称取决于您的发行版)和/或破解@ACyclic 提到的setup.py 文件,以确保Python 安装正确指向ssl 标头。
【解决方案2】:

下划线通常表示 C 模块(即 DLL),Python 找不到。你自己构建了python吗?如果是这样,您需要包括 SSL 支持。

【讨论】:

    【解决方案3】:

    要么使用包管理器安装 python-ssl 的补充包,要么 使用 -with-ssl 重新编译 Python(需要安装 OpenSSL 头文件/库)。

    【讨论】:

      【解决方案4】:

      我遇到了完全相同的问题。我在没有重建python的情况下修复了它,如下:

      1. 查找另一台服务器,具有相同的架构(i386 或 x86_64)和相同的 python 版本(例如:2.7.5)。是的,这是困难的部分。如果找不到任何具有相同 python 版本的服务器,您可以尝试将 python 从源安装到另一台服务器。

      2. 在这另一台服务器上,检查 import ssl 是否有效。它应该可以工作。

      3. 如果可行,请尝试找到 _ssl 图书馆,如下所示:

        [root@myserver]# find / -iname _ssl.so
        /usr/local/python27/lib/python2.7/lib-dynload/_ssl.so
        
      4. 将此文件复制到原始服务器。使用相同的目标文件夹: /usr/local/python27/lib/python2.7/lib-dynload/

      5. 双重检查所有者和权限

        [root@myserver]# chown root:root _ssl.so
        [root@myserver]# chmod 755 _ssl.so
        
      6. 现在你应该可以导入 ssl 了。

      这在 CentOS 6.3 x86_64 环境中使用 python 2.7.3 对我有用。我还安装了 python 2.6.6,但 ssl 工作正常。

      【讨论】:

      • 这实际上解决了我在 linuxbrew python 2.7.10 上的问题,您实际上并不需要寻找另一台服务器。安装linuxbrew,然后安装pyenv。使用pyenv 构建相同的python 版本并复制_ssl.so。我还需要从~/.linuxbrew/Cellar/python/2.7.10/lib/python2.7/lib-dynload 目录中删除_ssl_failed.so
      • 发现很重,不妨先试试:locate ssl.solocate _ssl.so
      【解决方案5】:

      如果您从源代码构建 Python,这只是依赖关系问题:由于您错过了安装的 OpenSSL 库,python 会默默地安装 _ssl 模块。您可以在 ma​​ke 命令的最终报告中看到它:

      Python build finished, but the necessary bits to build these modules were not found:
      _bsddb             _sqlite3           _ssl
      _tkinter           bsddb185           dbm
      dl                 gdbm               imageop
      sunaudiodev
      To find the necessary bits, look in setup.py in detect_modules() for the module's name.
      

      在任何标准库路径(/usr/lib/usr/local/lib...)中安装 OpenSSL 库应该可以解决问题。无论如何,这就是我所做的:-)

      【讨论】:

      • 在 linux 系统上,如果你安装 openssl-devel,然后重新配置并重新编译,它将工作。记得重新编译或重新安装任何可能需要 ssl 的服务(如 tornado)才能获得 ssl。
      • 在 Ubuntu 上,我能够使用 sudo apt-get build-dep python3.4 获得编译可选模块所需的依赖项
      【解决方案6】:

      在 Solaris 11 上,我必须修改 setup.py 以在 SSL 包含搜索路径中包含 /opt/csw/include/openssl。

      呜呜

      【讨论】:

        【解决方案7】:

        与原始问题无关,但因为这是 Google 的第一个结果...我在 Google AppEngine 上点击了这个,不得不添加:

        libraries:
        - name: ssl
          version: latest
        

        发送至 app.yamlhttps://cloud.google.com/appengine/docs/python/sockets/ssl_support

        请注意:这似乎适用于 Python 2.7.9 版本,但不适用于 2.7.10 或 2.7.11。

        【讨论】:

        • 我刚刚尝试了这个,它完全崩溃了我的应用程序,以至于在将它注释掉后我收到了一个新错误,如果我把它留在里面,我得到 ImportError: cannot import name RAND_egd
        • 我已将我的 python 版本从 2.7.11 降级到 2.7.9,现在它似乎可以工作了
        【解决方案8】:

        由于 --with-ssl 不再被识别,我只安装了libssl-dev。 对于基于 debian 的系统:

        sudo apt-get install libssl-dev 
        

        对于 CentOS 和 RHEL

        sudo yum install openssl-devel
        

        要重新启动 make 首先清理:

        make clean
        

        然后重新开始,依次执行以下命令:

        ./configure
        make
        make test
        make install
        

        有关 OpenSSL 的更多信息,请访问Ubuntu Help Page on OpenSSL

        【讨论】:

        • 如果你在 CentOS 上,命令是:sudo yum install openssl-devel
        【解决方案9】:

        我正在为那些仍然面临此类问题且无法找到解决方案的人编写此解决方案。

        就我而言,我正在使用

        共享主机(Cpanel 访问)Linux CentOS。

        我遇到了这个问题

        No module named '_ssl'
        

        我尝试了所有可能的解决方案,但正如您所知,有时事情对您不起作用,并且在托管时您无法访问完全根目录并运行查询。 甚至我的托管服务提供商也为我做了......但没有好的结果。

        如果你使用共享主机并且你已经部署了你的 Django 应用程序,我是如何解决的

        设置 Python 应用程序

        你只需要降级你的 Python 版本,我降级了

        Python 3.7.3
        

        (因为 Python 3.7 中没有 SSL 模块) 到

        Python 3.6.8
        

        通过设置 Python 应用程序。

        希望对遇到同样问题的人有所帮助,

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-04-18
          • 2013-03-11
          • 2012-12-07
          • 2012-05-23
          • 2019-07-29
          • 2015-07-04
          • 2014-03-15
          相关资源
          最近更新 更多