【问题标题】:Python import paramiko error "cannot import name util"Python 导入 paramiko 错误“无法导入名称 util”
【发布时间】:2015-03-31 20:45:33
【问题描述】:

我已经安装了 paramiko 模块。但是,当我尝试导入该模块时。我收到以下错误。

import paramiko
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-42-e77d47aa6e4a> in <module>()
----> 1 import paramiko

C:\Anaconda\lib\site-packages\paramiko\__init__.py in <module>()
     28 
     29 
---> 30 from paramiko.transport import SecurityOptions, Transport
     31 from paramiko.client import SSHClient, MissingHostKeyPolicy, AutoAddPolicy, RejectPolicy, WarningPolicy
     32 from paramiko.auth_handler import AuthHandler

C:\Anaconda\lib\site-packages\paramiko\transport.py in <module>()
     30 
     31 import paramiko
---> 32 from paramiko import util
     33 from paramiko.auth_handler import AuthHandler
     34 from paramiko.ssh_gss import GSSAuth

ImportError: cannot import name util

有人知道如何解决这个问题吗?

【问题讨论】:

  • 你是用哪个命令安装 paramiko 的?
  • 有人发现了吗?
  • 刚刚检查了 Linux 安装,/usr/lib/python2.7/dist-packages/paramiko/transport.py 有相同的行(但在 33 处)。这个“无法导入名称”错误通常与循环依赖的导入有关,但 paramiko 本身通常没有这个问题(参见 *.com/questions/9252543/… 的示例)。哪个版本的python?您是否在示例之前导入了其他内容?
  • 解决了吗?我对 python 2.7.6 有同样的问题

标签: python importerror paramiko


【解决方案1】:

我自己也遇到了同样的问题(python 2.7.6),在这里遇到了这个答案 ImportError: Cannot import name X ,在问题的 cmets 中提到,表明这是一个循环依赖问题。

在没有找到任何优雅的解决方案后,我发现自己在 site-packages/paramiko/transport.py 编辑 paramiko 的源代码:

  • 评论/删除行from paramiko import util
  • 将每次出现的util(在此文件中)替换为paramiko.util
  • 替换时要小心:不要替换现有的paramiko.util

这已经解决了我的问题,让我有些困惑:一方面,修改导入方法似乎可以解决这个问题,但另一方面 Python 处理它就像... 99% 的情况。 .?尴尬。

【讨论】:

    【解决方案2】:

    我们可以将导入行编辑为:

    from . import util
    

    所以我们不必每次都更改。

    奇怪的是,在 paramiko 2.4 中修复了这个之后,我又出现了一个导入错误,就是:

    > python
    Python 2.7.5 (default, Aug  4 2017, 00:39:18)
    [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import paramiko
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/lib/python2.7/site-packages/paramiko/__init__.py", line 22, in <module>
        from paramiko.transport import SecurityOptions, Transport
      File "/usr/lib/python2.7/site-packages/paramiko/transport.py", line 38, in <module>
        from paramiko.auth_handler import AuthHandler
      File "/usr/lib/python2.7/site-packages/paramiko/auth_handler.py", line 48, in <module>
        from paramiko.ssh_gss import GSSAuth, GSS_EXCEPTIONS
      File "/usr/lib/python2.7/site-packages/paramiko/ssh_gss.py", line 54, in <module>
        GSS_EXCEPTIONS = (gssapi.GSSException,)
    AttributeError: 'module' object has no attribute 'GSSException'
    

    事实证明,我以某种方式安装了cyrus-sasl-gssapi,它具有模块gssapi,但没有GSSException。所以python很困惑。我删除了包裹,一切都很好。如果您有 python-gssapi,请务必也将其删除。

    这是 paramiko(#1069) 的问题。但在 Python 2.7 的 paramiko 2.4 中没有修复。已经举报了。

    【讨论】:

      【解决方案3】:

      尝试重新安装它。就我而言,它有效。

      pip uninstall paramiko
      pip install paramiko --upgrade
      

      【讨论】:

        【解决方案4】:

        我的方法是从这里https://pypi.org/project/utils/#files下载python utils,然后pip install utils-0.9.0-py2.py3-none-any.whl,问题已经解决。我认为真正的原因是没有lib utils 。

        【讨论】:

          【解决方案5】:

          为了补充 Kludge 的答案,我们需要在以下每个文件中将“util”替换为 paramiko.util”: transport.py、dsskey.py、ber.py、pkey.py、kex_gex.py、kex_group1.py、kex_gss.py、packet.py、primes.py、sftp_client.py、sftp.py、sftp_server.py .

          为了更清楚,引用 Kludge 的方法:

          • 从 paramiko import util 中注释/删除该行
          • 将每次出现的 util(在此文件中)替换为 paramiko.util
          • 替换时要小心:不要替换现有的 paramiko.util

          【讨论】: