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

如何在Bash中同步显示管道输入文件内容与Python程序输出?

问题

我有一个名为process.py的Python文件,通过input()函数逐行接收用户输入,并输出输入内容的首字母,代码如下:

first_letter = []

for i in range(3):
    word = input("> ")
    l = word[0].upper()
    first_letter.append(l)
    print(f"{i}:{l}")

print("".join(first_letter))

另有一个名为tmp_in.txt的文本文件,内容为:

apple
banana
cherry

希望通过管道向process.py模拟用户输入时,同时显示输入内容与程序输出,达到如下效果:

> apple
0: A
> banana
1: B
> cherry
2: C
ABC

要求不能修改原process.py文件,且process.py中的input提示文本可能不固定(可为空、"Type word here:"等)。之前尝试用cat tmp_in.txt | tee /dev/tty | python process.py,但会先一次性显示所有输入内容,再显示程序输出,效果不符合预期:

apple
banana
cherry> 0:A
> 1:B
> 2:C
ABC
解决方法

方法一:使用Bash脚本实时交互

利用Bash的协进程(coproc)实现和process.py的逐行交互,精准捕获提示、发送输入并同步输出:

#!/bin/bash

# 启动process.py作为协进程
coproc PYTHON { python process.py; }

# 逐行读取输入文件内容
while IFS= read -r line; do
    # 读取process.py输出的输入提示
    read -r -u "${PYTHON[0]}" prompt
    # 打印提示+输入内容
    echo -n "$prompt"
    echo "$line"
    # 将输入内容传给process.py
    echo "$line" >&"${PYTHON[1]}"
    # 读取process.py返回的输出行
    read -r -u "${PYTHON[0]}" output
    echo "$output"
done < tmp_in.txt

# 读取最后一行的汇总输出
read -r -u "${PYTHON[0]}" final_output
echo "$final_output"

将上述代码保存为run_process.sh,添加执行权限:chmod +x run_process.sh,运行./run_process.sh即可得到目标效果。

方法二:使用Python包装器脚本

编写一个Python包装器,通过子进程管道和process.py实时交互,适配不同的提示文本:

import subprocess

def run_with_input(input_file):
    # 启动process.py子进程,启用行缓冲保证实时输出
    proc = subprocess.Popen(
        ["python", "process.py"],
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        stderr=subprocess.STDOUT,
        text=True,
        bufsize=1
    )

    with open(input_file, 'r') as f:
        input_lines = [line.rstrip('\n') for line in f]

    for line in input_lines:
        # 读取process.py输出的提示信息
        prompt = proc.stdout.readline().rstrip('\n')
        # 打印提示与输入内容
        print(f"{prompt}{line}")
        # 发送输入给子进程
        proc.stdin.write(f"{line}\n")
        proc.stdin.flush()
        # 读取并打印子进程的输出
        output = proc.stdout.readline().rstrip('\n')
        print(output)
    
    # 读取最后一行的汇总结果
    final_output = proc.stdout.readline().rstrip('\n')
    print(final_output)

if __name__ == "__main__":
    run_with_input("tmp_in.txt")

将代码保存为wrapper.py,运行python wrapper.py即可实现需求。这个方法对process.py的提示文本变化兼容性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:10:09