Я использую библиотеку asyncssh в приложении Sanic (запускает цикл событий Asyncio) для создания клиентского соединения SFTP.В моем коде я делаю это:
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
Я получаю эту ошибку, когда я пытаюсь сделать это:
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 в 0x79hsb999.SSHClientStreamSession объект в 0x7f51bbb29f98)
Так что он на самом деле возвращает 4 значения ... и когда я смотрю на исходный код для asyncSSH, то, что на самом деле делает start_sftp_client (), он ищет только три:
writer, reader, _ = yield from self.open_session(subsystem='sftp', encoding=None)
Так что имеет смысл, что эта ошибка выдается ... но почему?
Когда яЗапустите этот метод из консоли Python - он работает просто отлично.SFTP-клиент правильно создан из этого скрипта:
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())