我正在关注 Flutter 的 PR 并遇到了以下代码:
if (chunkCallback != null) {
chunkCallback!(0, 100);
}
Run Code Online (Sandbox Code Playgroud)
后面的感叹号是什么意思chunkCallback
?我在 Google 上搜索的任何东西都不起作用。
我正在尝试使用 Python asyncio 子进程来启动交互式 SSH 会话并自动输入密码。实际用例并不重要,但它有助于说明我的问题。这是我的代码:
proc = await asyncio.create_subprocess_exec(
'ssh', 'user@127.0.0.1',
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.STDOUT,
stdin=asyncio.subprocess.PIPE,
)
# This loop could be replaced by async for, I imagine
while True:
buf = await proc.stdout.read()
if not buf:
break
print(f'stdout: { buf }')
Run Code Online (Sandbox Code Playgroud)
我希望它能像 asyncio 流一样工作,我可以在其中创建两个任务/子例程/future,一个用于监听StreamReader
(在本例中由 给出proc.stdout
),另一个用于写入 StreamWriter ( proc.stdin
)。
但是,它并没有按预期工作。ssh 命令的前几行输出直接打印到终端,直到出现密码提示(或主机密钥提示,视情况而定)并等待手动输入。我希望能够读取前几行,检查它是否要求输入密码或主机提示,并相应地写入 StreamReader。
它运行该行的唯一一次print(f'stdout: { buf }')
是在我按 Enter 键后,当它打印时,显然,“stderr:b'主机密钥验证失败。\r\n'”。
我也尝试了推荐的proc.communicate()
,它不像使用 StreamReader/Writer 那么简洁,但它有同样的问题:等待手动输入时执行冻结。
这实际上应该如何运作?如果这不是我想象的那样,为什么不呢?有没有什么方法可以实现这一点,而无需诉诸线程中的某种繁忙循环?
PS:我解释使用 ssh 只是为了清楚起见。我最终使用 plink 来实现我想要的功能,但我想了解如何使用 python 来运行任意命令。