我试图从同步回调函数(Paramiko Upload callback)调用异步函数,但失败了


import os
import paramiko
import asyncio
async def async_websocket_call(msg):
print(msg)
async def test_paramiko():
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("web.demo.net", username="root", key_filename=os.environ['USERPROFILE'] + "\.ssh\id_rsa")
def upload_callback(sofar, total):
loop = asyncio.get_running_loop()
task = loop.create_task(async_websocket_call("Uploaded: {0:.1f}%".format(100*(sofar/total))))
asyncio.wait(task, timeout=None)

sftp = ssh.open_sftp()
sftp.put('test.tar.gz', '/var/www/html/test.tar.gz', upload_callback)
sftp.close()
ssh.close()
loop = asyncio.get_event_loop()
loop.run_until_complete(test_paramiko())
loop.close()

我收到错误消息:运行时间警告:协同程序"等待"从未等待

我不能等待等待方法,因为我不在异步方法中。。。

更新:

asyncssh似乎也不是一个解决方案,因为

asyncssh sftp.put使用SFTPProgressHandler类型的progress_handler:

SFTPProgressHandler = Optional[Callable[[bytes, bytes, int, int], None]]

所以这似乎也不支持异步回调。

因此,在进一步深入研究之后,唯一的解决方案似乎是:

import nest_asyncio
nest_asyncio.apply()

loop = asyncio.new_event_loop()
loop.run_until_complete

最新更新