关于paramiko的问题,是bug还是环境问题,如何解?

最近同事在用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位

阅读 2.1k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题