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

如何通过外部脚本与不可修改的Script1.py实现交互:读取输出并发送指定选择项

当然有可行的办法!最实用的方案就是借助Python自带的subprocess模块,让你的外部脚本和Script1.py实现交互式通信——它能帮你捕获Script1的输出内容,再自动发送你指定的选择项,完全替代人工操作。下面分两种场景给你具体方案:

方法一:用Python脚本实现灵活交互(推荐)

这种方式适合多轮复杂选择的场景,能精准响应Script1的每一次输出提示。

假设你的Script1.py逻辑是这样的(不可修改):

# Script1.py
print("=== 操作菜单 ===")
print("1. 导出数据")
print("2. 生成报告")
print("3. 退出")
choice = input("请输入选择的序号:")
print(f"你选择了{choice},开始执行...")
if choice == "2":
    confirm = input("是否需要包含详细统计?(y/n):")
    print(f"确认选择:{confirm},正在生成报告...")

那你可以写一个外部交互脚本auto_interact.py,代码如下:

# auto_interact.py
import subprocess

# 启动Script1.py,接管它的标准输入和输出
proc = subprocess.Popen(
    ["python", "Script1.py"],
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    text=True  # 用文本模式,直接处理字符串而非字节流
)

# 逐行读取Script1的输出,根据提示发送对应输入
while True:
    line = proc.stdout.readline()
    if not line:  # 输出结束时退出循环
        break
    cleaned_line = line.strip()
    print(f"[Script1输出] {cleaned_line}")
    
    # 匹配第一个选择提示,发送"2"
    if "请输入选择的序号:" in cleaned_line:
        proc.stdin.write("2\n")
        proc.stdin.flush()  # 必须刷新缓冲区,确保输入被发送给子进程
    # 匹配第二个确认提示,发送"y"
    elif "是否需要包含详细统计?(y/n):" in cleaned_line:
        proc.stdin.write("y\n")
        proc.stdin.flush()

# 等待子进程结束,获取剩余输出和错误信息
final_output, errors = proc.communicate()
if final_output:
    print(f"[Script1最终输出] {final_output.strip()}")
if errors:
    print(f"[Script1错误信息] {errors.strip()}")

关键注意事项:

  • 一定要开启text=True(Python3.7+)或universal_newlines=True(旧版本),避免处理字节流的麻烦。
  • 发送输入后必须调用stdin.flush(),否则输入会留在缓冲区,Script1无法接收到。
  • 如果Script1的输出有缓冲延迟,可以考虑用线程异步读取输出,避免出现死锁。
方法二:用批处理脚本(.bat)实现(Windows简单场景)

如果你的需求只是单次选择,且不需要根据动态输出判断,用批处理会更轻量化:

@echo off
:: 直接将选择项"2"通过管道发送给Script1.py
echo 2 | python Script1.py

但这种方式只适合单轮输入的场景,多轮交互的话批处理很难处理动态输出的判断逻辑,还是推荐用Python脚本。

内容的提问来源于stack exchange,提问作者Sevij

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:52:31