'HostKeys'对象没有属性'has_key'

时间:2014-06-23 12:17:04

标签: python paramiko

我是使用paramiko通过sftp上传文件的方法,但我收到了这个错误。

   ri @ ri-desktop:〜/ workspace / ssh $ python testssh.py
  追溯(最近的呼叫最后):
    文件“testssh.py”,第75行,中       if host_keys.has_key(hostname):
  AttributeError:'HostKeys'对象没有属性'has_key'

这是我的test.py

中的代码
hostkeytype = None
hostkey = None
files_copied = 0

try:
    host_keys = paramiko.util.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))<br/>

except IOError: 
    try:
        # try ~/ssh/ too, e.g. on windows
        host_keys = paramiko.util.load_host_keys(os.path.expanduser('~/ssh/known_hosts'))
    except IOError:
        print '*** Unable to open host keys file'
        host_keys = {}
if host_keys.has_key(hostname):
    hostkeytype = host_keys[hostname].keys()[0]

    hostkey = host_keys[hostname][hostkeytype]
    print 'Using host key of type {0}'.format(hostkeytype)

3 个答案:

答案 0 :(得分:2)

paramiko.util.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
paramiko.util.load_host_keys(os.path.expanduser('~/ssh/known_hosts'))

这些函数中的任何一个成功运行并返回一个没有has_key属性的对象,或者你正在使用python 3,其中has_key has been removed from dicts

由于你使用的是python 2.x,问题应该是这些函数返回的内容没有has_key属性

我查看了paramiko.util的源代码,事实上,util.load_host_keys返回的不是字典,而是HostKeys object,它没有实现has_key(),所以你无法在host_keys对象上调用该函数

因为HostKeys类的docstring说明了这个

  

.HostKeys对象可以像dict一样对待;任何字典查找都是       相当于调用lookup

你可以改用

if hostname in host_keys:

答案 1 :(得分:0)

通过添加以下代码来测试host_keys是否为字典:print type(host_keys)

之前if host_keys.has_key(hostname):

答案 2 :(得分:0)

您使用的是哪个版本的Python?因为has_key已在3.xx中弃用:

  

移除。 dict.has_key() - 改为使用in运算符。

来源:https://docs.python.org/3.1/whatsnew/3.0.html