如何在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
相关产品推荐
相关产品推荐

