iTerm2 Python API使用问题:执行命令后如何捕获返回结果
方案1:无交互场景直接使用async_run_command
如果仅需执行单条命令、无需和执行过程交互,直接调用session自带的async_run_command方法即可,这是官方提供的专门用于执行命令并捕获返回结果的API,无需手动处理流监听。
#!/usr/bin/env python3 import iterm2 async def main(connection): app = await iterm2.async_get_app(connection) session = app.current_window.current_tab.current_session if session is not None: # 传入要执行的命令,方法会等待命令执行完成后返回stdout全量内容 cmd_output = await session.async_run_command("date") print("命令执行结果:\n", cmd_output) iterm2.run_until_complete(main)
方案2:交互场景下ScreenStreamer+async_get_contents的正确用法
你之前单独调用async_get_contents或者用ScreenStreamer没有拿到预期结果,核心原因是命令发送到终端后执行是异步过程,读取终端内容的时机早于命令执行完成、输出渲染到屏幕的时间,正确写法如下:
#!/usr/bin/env python3 import iterm2 import asyncio async def main(connection): app = await iterm2.async_get_app(connection) session = app.current_window.current_tab.current_session if session is None: return output = [] # 开启屏幕流监听 async with session.get_screen_streamer() as streamer: # 发送要执行的命令 await session.async_send_text('date\n') # 等待命令执行完成,可根据命令预期执行时长调整,也可自定义逻辑识别shell提示符判断执行结束 await asyncio.sleep(0.5) # 读取当前终端所有可见行内容 screen_contents = await session.async_get_contents() # 过滤第一行的输入命令本身,剩余行即为命令输出 for line in screen_contents[1:]: stripped_line = line.string.rstrip() if stripped_line: output.append(stripped_line) print("命令执行结果:\n", "\n".join(output)) iterm2.run_until_complete(main)
如果需要适配执行时长不固定的命令,可以增加逻辑校验终端最后一行是否匹配你的shell提示符,匹配后再读取内容即可,不需要固定设置sleep时长。
内容的提问来源于stack exchange,提问作者Jarek
相关产品推荐
相关产品推荐

