2013-10-31 69 views
0

我有以下的調用,它的工作原理(實際上提出了一個paramiko.AuthenticationException,這是很好的):的paramiko:傳遞一個字典作爲參數來連接

import paramiko 
ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect('example.com',username='root', password="aaa", look_for_keys=False, timeout=5) 

我想將參數轉換爲一個字典:

params = { 
    'hostname': 'example.com', 
    'port': 22, 
    'username': 'root', 
    'look_for_keys': False, 
    'timeout': 5 
    } 
ssh.connect(params) 

這會產生一個TypeError: getaddrinfo() argument 1 must be string or None。我檢查了參數ssh.connect

>>> inspect.getargspec(ssh.connect) 
ArgSpec(args=['self', 'hostname', 'port', 'username', 'password', 'pkey', 'key_filename', 'timeout', 'allow_agent', 'look_for_keys', 'compress', 'sock'], varargs=None, keywords=None, defaults=(22, None, None, None, None, None, True, True, False, None)) 

和我的字典看起來不錯。

然而,由於第一個電話是好的,誤差插座與我試過

ssh.connect('example.com', 22, params) 

這引起了paramiko.SSHException: No authentication methods available。我將此解釋爲connect沒有任何密碼或密鑰來測試。

我該怎麼做才能讓ssh.connect接受一個字典作爲參數(或者實際上 - 該字典應該與我的相比有多大差異)?

或者是否有另一種pythonic方式來傳遞參數,缺少構建參數字符串「手動」(通過連接字符串,這看起來很糟糕)?

+0

簽名是否兼容,以便'ssh.connect('example.com',22,** params)'有效? –

+0

我試過'(** params)',它開箱即用。非常感謝。你介意把你的評論變成答案,以便我能接受它嗎?另外:「簽名兼容」是什麼意思? – WoJ

回答

0

字典可以是「解包」,並在函數調用中使用**被用作雖然關鍵字參數已經明確聲明,如:

ssh.connect('example.com', 22, **params) 

你一定要小心,位置參數都滿足並且不在dict中複製,例如:正常函數調用的規則...