首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AsyncSSH创建SFTP客户端错误-太多的值需要解包

AsyncSSH创建SFTP客户端错误-太多的值需要解包
EN

Stack Overflow用户
提问于 2019-03-27 07:54:04
回答 1查看 476关注 0票数 2

我在Sanic应用程序中使用异步SFTP库(运行Asyncio事件循环)来创建SFTP客户端连接。在我的代码中,我是这样做的:

代码语言:javascript
复制
class MyClass:
    async def connect(self, host, username, password, port):
        return await asyncssh.connect(host=host, port=port, username=username, password=password, known_hosts=None)

    async def establish_sftp_client(self, conn):
        return await conn.start_sftp_client()

    # This is my invoker:
    async def create_connection(self, <some args>):
        conn = await self.connect()
        sftp_client = await self.establish_sftp_client(conn)
        ...
        return conn, sftp_client

当我尝试这样做时,我会得到这个错误:

代码语言:javascript
复制
Traceback (most recent call last):
File "/tmp/pycharm_projects/<MY SANIC APP>/requests/helpers.py", line 378, in establish_sftp_client
    return await conn.start_sftp_client()
  File "<MY SANIC APP>/venv/lib/python3.6/site-packages/asyncssh/misc.py", line 182, in __await__
    return (yield from self._coro)
  File "<MY SANIC APP>/venv/lib/python3.6/site-packages/asyncssh/connection.py", line 3503, in start_sftp_client
    encoding=None)
ValueError: too many values to unpack (expected 3)

当我调试它并注销start_sftp_client()实际返回的内容时,我得到如下信息:

(asyncssh.stream.SSHWriter对象位于0x7f51bbb29dd8,asyncssh.stream.SSHReader对象位于0x7f51bbb29da0,asyncssh.stream.SSHReader对象位于0x7f51b99b7978,asyncssh.stream.SSHClientStreamSession对象位于0x7f51bbb29f98) )

因此,当我查看asyncSSH的源代码时,它实际上是返回4 asyncSSH,在start_sftp_client()实际上所做的工作中,它只需要寻找三个:

writer, reader, _ = yield from self.open_session(subsystem='sftp', encoding=None)

,所以这个错误就是thrown...but,为什么?

当我从python控制台运行这个方法时--它工作得很好。从此脚本正确地创建了SFTP客户端:

代码语言:javascript
复制
import asyncssh, asyncio

async def x():
    conn = await asyncssh.connect(host='<host'>, username='some name', password='some pass', port=22, known_hosts=None)
    sftp = await conn.start_sftp_client()
    print("sftp {}".format(sftp)) # This works!

asyncio.get_event_loop().run_until_complete(x())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-28 16:40:51

在将日志语句放置在代码库中之后,最终找到了造成此问题的根本原因。这些行隐藏在一些模糊的文件中:

代码语言:javascript
复制
@asyncio.coroutine
def open_session(self, *args, **kwargs):            
    chan, session = yield from self.create_session(CoreSSHClientStreamSession,
                                                   *args, **kwargs)

    return (asyncssh.stream.SSHWriter(session, chan), asyncssh.stream.SSHReader(session, chan),
            asyncssh.stream.SSHReader(session, chan, asyncssh.constants.EXTENDED_DATA_STDERR))


asyncssh.SSHClientConnection.open_session = open_session

最后一行覆盖异步the中的open_session方法!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55372230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档