最近同事在用python的paramiko库的时候遇到了一个很少见的问题,这个问题我曾经忽略过它,不过现在需要解决。就是在使用paramiko进行文件下拉的时候,出现了一个异常,代码及报错信息如下:
# -*- coding: utf-8 -*-
import paramiko
def test():
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='xxxx', port=22, username='root', password='', compress=True)
channel = ssh.get_transport()
sftp = paramiko.SFTPClient.from_transport(channel)
sftp = ssh.open_sftp()
sftp.get("/tmp/device.conf", "./device.conf")
if __name__ == '__main__':
test()
Traceback (most recent call last):
File "C:/Users/ts/Desktop/test.py", line 15, in <module>
test()
File "C:/Users/ts/Desktop/test.py", line 10, in test
sftp = paramiko.SFTPClient.from_transport(channel)
File "E:\Python2.7_64\lib\site-packages\paramiko\sftp_client.py", line 140, in from_transport
return cls(chan)
File "E:\Python2.7_64\lib\site-packages\paramiko\sftp_client.py", line 103, in __init__
server_version = self._send_version()
File "E:\Python2.7_64\lib\site-packages\paramiko\sftp.py", line 107, in _send_version
t, data = self._read_packet()
File "E:\Python2.7_64\lib\site-packages\paramiko\sftp.py", line 174, in _read_packet
x = self._read_all(4)
File "E:\Python2.7_64\lib\site-packages\paramiko\sftp.py", line 162, in _read_all
out += x
TypeError: cannot concatenate 'str' and 'tuple' objects
看其报错信息,是不能把str和tuple类型的变量相加,可这是paramiko库里的错误,在我开启断点调试之后,发现out初始值是"",x是由代码中的self.sock.recv接收到的数据,而x的类型居然是tuple。类似于("",None)这样的结构,其中x[0]是真正所需要的值。于是我临时的解决办法是加一个x变量的类型判断,若x是字符串,则out += x,若x是tuple,则out += x[0]。这样一来,程序居然能正常跑了,结果也与预期的一致。
有没有人遇到过相同的情况?你们又是怎么解的?
ps:同事开发环境: win7 x64,python2.7 64位