这个问题可能很愚蠢,但我讨厌编程语言对我这么做......所以我有以下功能:
def udp_server(client=""):
mutex.acquire()
try:
print "Starting server ... "
server_process = subprocess.Popen("iperf.exe -s -u -i 1 -l 872",
stderr=subprocess.STDOUT,
stdout=subprocess.PIPE)
print "Server started at ", server_process.pid
print "Starting the client remotely on %s" % client
cmd = "cd C:/performance/Iperf && python iperf_udp_client.py -c %s" % client
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.WarningPolicy())
client.connect(str(client), username=str(config['ssh_user']),
password=str(config['ssh_pwd']))
stdin, stdout, stderr = client.exec_command(cmd)
print stdout.readlines()
server_process.kill()
except Exception, e:
print e
finally:
mutex.release()
加载函数时加载 config
...将值分配给mode.config
文件,该文件很好地解析为config
(我测试过它)
if __name__ == '__main__':
config = {}
execfile('C:\performance\mode.config', config)
main()
当我将值硬编码到client.connect()
时,它工作得很好,但是,当我尝试以正确的方式(使用配置文件,而不是硬编码)时,我得到以下错误:
Starting the client remotely on 123.456.795
getaddrinfo() argument 1 must be string or None
当然client
是一个字符串:client = config['client']
。有人可以帮帮我吗? Python版本为2.7.5
。
答案 0 :(得分:4)
您正在使用client = config['client']
覆盖client = paramiko.SSHClient()
定义(这是您的想法)。重命名两个变量之一。
答案 1 :(得分:1)
您已将两个不同的变量命名为client
:您要连接的客户端的主机名,以及您用于连接的SSHClient
实例。
当你这样做时
client.connect(str(client), ...)
您实际上是在传递str
的{{1}},而不是客户端的主机名。这将导致无法解析主机名(可能看起来像SSHClient
)。
您可以通过重命名其中一个变量来解决此问题。例如,您可以调用主机名<SSHClient instance at 0xdeadbeef>
而不是hostname
。