【问题标题】:Python AttributeError: 'module' object has no attribute 'SSL_ST_INIT'Python AttributeError:“模块”对象没有属性“SSL_ST_INIT”
【发布时间】:2017-09-02 04:35:09
【问题描述】:

我的一个 Python 脚本失败了:

Traceback (most recent call last):
  File "./inspect_sheet.py", line 21, in <module>
    main()
  File "./inspect_sheet.py", line 12, in main
    workbook_name=workbook_name,
  File "./google_sheets.py", line 56, in __init__
    self.login()
  File "./google_sheets.py", line 46, in login
    self.client = gspread.authorize(credentials)
  File "/usr/local/lib/python2.7/site-packages/gspread/client.py", line 335, in authorize
    client.login()
  File "/usr/local/lib/python2.7/site-packages/gspread/client.py", line 98, in login
    self.auth.refresh(http)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 598, in refresh
    self._refresh(http.request)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 769, in _refresh
    self._do_refresh_request(http_request)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 795, in _do_refresh_request
    body = self._generate_refresh_request_body()
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 1425, in _generate_refresh_request_body
    assertion = self._generate_assertion()
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 1554, in _generate_assertion
    private_key, self.private_key_password), payload)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/crypt.py", line 162, in from_string
    from OpenSSL import crypto
  File "/usr/local/lib/python2.7/site-packages/OpenSSL/__init__.py", line 8, in <module>
    from OpenSSL import rand, crypto, SSL
  File "/usr/local/lib/python2.7/site-packages/OpenSSL/SSL.py", line 118, in <module>
    SSL_ST_INIT = _lib.SSL_ST_INIT
AttributeError: 'module' object has no attribute 'SSL_ST_INIT'

【问题讨论】:

  • 我用 debian-jessie 运行这个问题,从 jessie-backports 升级包 python-openssl (16.0.0-1~bpo8+1) 也不起作用,所以我必须升级它根据下面的解决方案使用 pip(使用的版本是 18.0.0)

标签: python openssl pyopenssl


【解决方案1】:

原来问题出在我安装的 pyOpenSSL pyOpenSSL-0.15.1 上。

我做到了:

pip uninstall pyopenssl

然后

pip install pyopenssl

...我的 Python 脚本再次运行!

【讨论】:

  • 我在运行pip 本身时遇到了问题,这解决了sudo easy_install pyOpenSSL
  • 刚刚升级了密码学;在我的情况下,您的解决方案就足够了
  • 就我而言,我必须像这样卸载:sudo aptitude purge python-openssl,因为它是使用aptitude 安装的。我想我可以用apt-get 做同样的事情
  • 每次运行 pip 时都会出现错误。 rm -rf cryptography 也是如此,并且可以再次运行 pip。
  • 这个问题让我无法成功运行 pip。因此,在按照 Ben 的说明进行操作之前,我必须从 lib/python2.7/site-packages 中删除密码学。
【解决方案2】:

我最近遇到了同样的问题,经过几个小时的调查,我发现它是由新的 cryptography 2.0 升级引起的。此升级将破坏许多使用 pyopenssl 的软件包(如 Sentry、Google Analytics 等)。只需将其降级到 1.9 即可解决问题。

如果您使用“pip install -U”请谨慎,它会自动升级requirements.txt中未列出的软件包。

【讨论】:

  • 谢谢,这行得通。升级 pyopenssl 对我来说还不够。
【解决方案3】:

更新您的pyopenssl 模块:

$ sudo pip install -U pyopenssl

【讨论】:

  • 谢谢,我认为这比卸载和重新安装更有效。
  • 如果您使用 virtualenv,则不需要 sudo。
【解决方案4】:

使用 pip 升级 pyopenssl 不起作用,因为与 pip 相关的命令都不适用于我。将pyopenssl升级为easy_install,即可解决上述问题。

sudo python -m easy_install --upgrade pyOpenSSL

信用@delimiter (Answer)

【讨论】:

  • 谢谢!执行此命令后,我必须重新启动终端/重新登录服务器,然后pip 工作正常。
  • 遇到新错误 -error: 安装脚本退出并出现错误:命令 'gcc' failed with exit status 1
  • 这可能很有帮助,但即使注销并重新登录,我仍然在 OP 中收到 AttributeError
【解决方案5】:

我在 Ubuntu 16.04 上遇到了同样的问题,但有以下变化:当 virtualenv 被激活时(. venv/bin/activate 在我的情况下使用 pysolr、请求等运行 celery worker 之前)——一切正常,但是当我运行 celery从使用完整路径和 python 路径的命令行 - 出现问题(以及从 supervisord 运行的相同问题)。此外,如果重要的话,virtualenv 已捆绑在具有相同 Ubuntu 版本的机器上的其他位置。

解决方案很简单:将 /full/path/to/venv/bin 添加到 PATH(此处建议 https://serverfault.com/questions/331027/supervisord-how-to-append-to-path)解决了这个问题。

很遗憾,我还没有确定是什么更新导致了这种情况,但希望这可能对某人有所帮助。

【讨论】:

    【解决方案6】:

    我也看到了AttributeError: 'module' object has no attribute 'SSL_ST_INIT' 错误。

    在做

    sudo pip install pyOpenSSL==16.2.0

    帮我解决了。

    【讨论】:

      【解决方案7】:

      在我的情况下,问题在于软件包安装在 root 目录中,而我正在执行脚本,该脚本要求我的 Linux 用户 forvas 提供pyopenssl .并且该用户无法使用安装在 root 中的库。

      所以首先我必须删除带有aptitudeapt-get 的包。

      sudo aptitude purge python-openssl
      

      因此,我不得不再次安装该软件包,但要考虑到正在执行请求库的脚本的用户。根据 Linux 用户和 pip 的参数 --user 查看库的安装位置。

      案例 1

      forvas@server:$ pip install pyopenssl
      

      由于 EnvironmentError 无法安装软件包:

      [Errno 13] 权限被拒绝:'/usr/local/lib/python2.7/dist-packages/OpenSSL'

      考虑使用--user 选项或检查权限。

      案例 2

      forvas@server:$ sudo pip install pyopenssl
      

      /usr/local/lib/python2.7/dist-packages/OpenSSL/*

      /usr/local/lib/python2.7/dist-packages/pyOpenSSL-17.5.0.dist-info/*

      案例 3

      forvas@server:$ sudo pip install --user pyopenssl
      

      /home/forvas/.local/lib/python2.7/site-packages/OpenSSL/*

      /home/forvas/.local/lib/python2.7/site-packages/pyOpenSSL-17.5.0.dist-info/*

      案例 4

      root@server:$ pip install pyopenssl
      

      /usr/local/lib/python2.7/dist-packages/OpenSSL/*

      /usr/local/lib/python2.7/dist-packages/pyOpenSSL-17.5.0.dist-info/*

      案例 5

      root@server:$ pip install --user pyopenssl
      

      /root/.local/lib/python2.7/site-packages/OpenSSL/*

      /root/.local/lib/python2.7/site-packages/pyOpenSSL-17.5.0.dist-info/*

      结论

      我的问题是该库安装在案例5的目录中。

      解决方案

      • 正在卸载包。

      • 当我使用 Linux 用户 forvas 执行脚本时,我能够使用选项 24(其中库可供所有 Linux 用户使用)或更准确地说,选项 3(其中库仅适用于 Linux 用户 forvas)。

      【讨论】:

      • 这对于 Python 3 的外观如何?
      • 下面这个例子,case 3 例如是sudo python3 -m pip install --user pyopenssl,并且包将存储在/home/forvas/.local/lib/python3.6/site-packages
      【解决方案8】:

      当我尝试 ssh 进入虚拟机时,我在 Ubuntu 16.04 虚拟机的控制台上看到 类似 python 堆栈转储。

      SSL_ST_INIT = _lib.SSL_ST_INIT
      AttributeError: 'module' object has no attribute 'SSL_ST_INIT'
      

      pip 报告pyopenssl 未安装。

      我不得不这样做:

      sudo apt install --reinstall python-openssl
      

      【讨论】:

        【解决方案9】:

        就我而言,它在卸载和升级时抛出了同样的错误。我无法卸载或升级。

        AttributeError: 'module' object has no attribute 'SSL_ST_INIT'

        以下对我有用。

        # rm -rf /usr/lib/python2.7/site-packages/OpenSSL/
        # rm -rf /usr/lib/python2.7/site-packages/pyOpenSSL-16.1.0.dist-info
        # rm -rf /usr/lib/python2.7/site-packages/pyOpenSSL-18.0.0-py2.7.egg
        # pip2.7 install pyopenssl
        Collecting pyopenssl
        Downloading 
        .
        .
        100% |████████████████████████████████| 61kB 5.8MB/s 
        Collecting cryptography>=2.2.1 (from pyopenssl)
        .
        .
        Installing collected packages: cryptography, pyopenssl
        Found existing installation: cryptography 1.7.2
        Uninstalling cryptography-1.7.2:
          Successfully uninstalled cryptography-1.7.2
        Successfully installed cryptography-2.2.2 pyopenssl-18.0.0
        

        警告:仅在升级 (sudo pip install pyOpenSSL==16.2.0) 或卸载 (pip uninstall pyopenssl) 没有帮助时尝试此操作

        【讨论】:

          【解决方案10】:

          尝试以下命令:

          easy_install -U pip
          easy_install -U pyOpenSSL
          

          【讨论】:

            【解决方案11】:

            我的问题是由 /usr/lib/python2.7/dist-packages/ 中的 Python openssl 版本引起的。

            dpkg -l | grep openssl 显示:

            ii  python-openssl                                0.15.1-2build1                               all          Python 2 wrapper around the OpenSSL library
            

            我使用sudo apt-get remove python-openssl 删除了它。然后我运行以下命令来安装 pip 的分发版本。

            curl -o ./get-pip.py https://bootstrap.pypa.io/get-pip.py
            sudo python2 ./get-pip.py
            

            pip --version 现在显示:

            pip 18.0 from /usr/local/lib/python2.7/dist-packages/pip (python 2.7)
            

            然后我能够执行我试图完成的必要 pip 安装。

            【讨论】:

            • 谢谢@heatfanjohn。我和你的情况完全一样,它就像你写的那样有效!
            【解决方案12】:

            我遇到了类似的错误:

                from OpenSSL import rand, crypto, SSL
              File "/usr/local/lib/python3.5/dist-packages/OpenSSL/SSL.py", line 112, in <module>
                SSL_ST_INIT = _lib.SSL_ST_INIT
            AttributeError: module 'lib' has no attribute 'SSL_ST_INIT'
            

            并且没有其他答案可以解决它,因为 pip 无法安装任何东西。相反,我首先从终端做的是:

            sudo rm -r /usr/local/lib/python3.5/dist-packages/OpenSSL
            

            然后用pip重新安装pyopenssl:

            sudo pip install pyopenssl
            

            一切都是肉汁。

            【讨论】:

            • 值得注意的是:如果你使用 virtualenv 那么可能你需要删除rm -r ~/.virtualenvs/YourEnv/local/lib/python3.6/site-packages/OpenSSL
            【解决方案13】:

            以防万一其他人没有找到完全正确的咒语来完成这项工作,截至 2018 年 11 月,对我有用的是:

            sudo rm -rf /usr/local/lib/python2.7/dist-packages/OpenSSL/ sudo apt install --reinstall python-openssl

            祝你好运!

            【讨论】:

              【解决方案14】:

              我刚刚在我的 Ubuntu 16.04 主机上遇到了这个问题。 python-openssl 和 python-crypotgraphy 的 apt repo 包之间似乎存在版本冲突,与有人使用 pip 手动安装到 /usr/local/python2.7/dist-packages 的版本冲突。

              一旦进入这种状态,系统标准 pip 也无法执行。我通过手动设置一个 PYTHONPATH 环境变量来解决鸡和蛋的问题,从而排除了树的 /usr/local 部分:

                  $ export PYTHONPATH="/usr/lib/python2.7:/usr/lib/python2.7/plat-x86_64-linux-gnu:/usr/lib/python2.7/lib-tk:/usr/lib/python2.7/lib-old:/usr/lib/python2.7/lib-dynload:/usr/lib/python2.7/dist-packages:/usr/lib/python2.7/dist-packages/gtk-2.0"
                  $ /usr/bin/pip uninstall cryptography
                  $ unset PYTHONPATH
              

              我获得了上述与 python shell 一起使用的库目录列表:

                  import sys
                  for p in sys.path:
                     print(p)
              

              然后复制除 /usr/local 目录之外的所有内容。您的系统可能在其路径中有不同的列表。相应调整。

              我的 bash 历史记录中还散布了一些手动的 apt-get install --reinstall python-openssl python-cryptography 命令,这可能是必要的,也可能是不必要的。

              【讨论】:

                【解决方案15】:

                尝试:

                export PYTHONPATH="/usr/lib/python2.7:/usr/lib/python2.7/plat-x86_64-linux-gnu:/usr/lib/python2.7/lib-tk:/usr/lib/python2.7/lib-old:/usr/lib/python2.7/lib-dynload:/usr/lib/python2.7/dist-packages:/usr/lib/python2.7/dist-packages/gtk-2.0"
                sudo apt-get install --reinstall python-openssl
                

                【讨论】:

                  【解决方案16】:

                  在这些其他解决方案不适合我之后,我的解决方案变得更加简单。我尝试通过 pip 安装/卸载的任何内容都返回了相同的错误和堆栈跟踪。

                  我最终尝试通过 pip3 更新 pip,但它运行良好:

                  pip3 install --upgrade pip

                  我重新使用 pip,一切正常。我确实注意到它在运行 pip 命令时引用了 Python 3.6。

                  # pip install pyopenssl`enter code here`
                  Requirement already satisfied: pyopenssl in /usr/lib64/python3.6/site-packages (18.0.0)
                  
                  <snipped>
                  
                  Requirement already satisfied: pycparser in /usr/lib64/python3.6/site-packages (from cffi!=1.11.3,>=1.7->cryptography>=2.2.1->pyopenssl) (2.19)
                  

                  【讨论】:

                    【解决方案17】:

                    我遇到了同样的问题,由于 pip 不再工作,我不得不手动完成他的工作:

                    wget https://files.pythonhosted.org/packages/40/d0/8efd61531f338a89b4efa48fcf1972d870d2b67a7aea9dcf70783c8464dc/pyOpenSSL-19.0.0.tar.gz
                    tar -xzvf pyOpenSSL-19.0.0.tar.gz
                    cd pyOpenSSL-19.0.0
                    sudo python setup.py install
                    

                    之后一切都按预期进行。

                    【讨论】:

                      【解决方案18】:

                      我在 MacOS 上通过 brew 安装了 python 2 和 3 时遇到了这个问题。事实证明,brew uninstalling python 和 python@2 并没有删除为这些版本的 python 安装的任何库;即在:

                      /usr/local/lib/python3.7/site-packages/
                      /usr/local/lib/python2.7/site-packages/

                      那里的东西不对,所以对我有用的是删除/移动所有已安装的 brew 的 python 2 和 3 库并重新开始(并确保从这里开始只使用 virtualenvs):

                      brew uninstall --ignore-dependencies python@2
                      brew uninstall --ignore-dependencies python
                      sudo mv /usr/local/lib/python3.7 ~/python3.7libs-backup
                      sudo mv /usr/local/lib/python2.7 ~/python2.7libs-backup
                      brew install python
                      brew install python@2
                      

                      【讨论】:

                        【解决方案19】:

                        这对我有用:

                        sudo apt remove python-openssl
                        

                        【讨论】:

                          【解决方案20】:

                          这是一篇较旧的帖子,所以我希望能在 2019 年末对某人有所帮助...我的问题与 Python 2 与 3 有关。我只使用 Python 3;不再有旧版 Python。但是我的操作系统(例如,Ubuntu 16.04)仍然安装了 Python 2.7。因此,当默认运行全局 pip(例如,不在 virtualenv 中)时,我调用的是 Python 2 版本的 pip

                          对我来说,我使用以下方法解决了这个问题。

                          卸载docker-compose:

                          sudo pip3 uninstall docker-compose  
                          sudo pip uninstall docker-compose
                          

                          为我的 Python 版本重新安装 docker-compose

                          sudo pip3 install docker-compose
                          

                          【讨论】:

                            【解决方案21】:

                            我正在运行 OSX 10.15.5 Catalina 并使用 pyenv。

                            在此页面上尝试了许多其他解决方案对我有用的是:

                            pyenv uninstall 3.6.8
                            pyenv install 3.6.8
                            

                            我不得不承认我不确定为什么这能解决这个问题,因为我最近才安装了这个版本的 Python。

                            【讨论】:

                              【解决方案22】:

                              在使用 pip 安装一些软件包后,我在新安装的 Raspberry Pi OS(以前称为 Raspbian)Buster Lite 32 位上收到 AttributeError: module 'lib' has no attribute 'ERR_load_RAND_strings'。其他答案的组合有效:

                              sudo rm -r /usr/local/lib/python3.9/dist-packages/OpenSSL
                              sudo pip uninstall --yes pyopenssl
                              sudo pip install pyopenssl
                              

                              第一个命令实际上不会删除软件包安装,只是删除它的文件,但uninstall 没有它会引发同样的错误。 显然我们正在处理一个 Pi,所以最后一个将是:

                              sudo pip install pyopenssl --no-cache-dir
                              

                              (我想我会重申其他问题,因为在搜索问题时不会出现这个 Q(它是通过 Google 的 ESP32 论坛出现的),所以我用更多的 Pi 关键字重复它)

                              【讨论】:

                                猜你喜欢
                                • 2018-07-07
                                • 2017-12-24
                                • 2015-03-09
                                • 2013-07-05
                                • 2011-10-25
                                • 2014-07-24
                                • 2015-11-21
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多