You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:15:00