如何通过Bash向Python程序传递输入 解决多输入场景EOFError问题
问题根源
你当前用的here-document写法(<<EOF ... EOF)是把Bash的第一个参数$1作为标准输入流内容喂给Python进程,当这部分内容被读取完毕后,Python的标准输入就直接到达EOF结束标记。如果你的Python代码后续还有input()这类读取标准输入的逻辑,再次读取时就会直接抛出EOFError: EOF when reading a line错误——因为标准输入已经被你传入的参数占满、读完就关闭了,没有预留交互输入的通道。
解决方法
你的核心需求是把Bash脚本的第一个参数作为文件名传给Python,完全没必要通过标准输入重定向传参,直接用命令行位置参数传递即可,这种方式不会占用标准输入,完全不影响后续的交互输入逻辑,是最规范的实现方式:
- Bash侧直接把参数跟在脚本后面传递即可,不需要写here-document块:
python main.py "$1"
- Python侧通过内置的
sys.argv列表读取传入的参数即可,sys.argv[0]是脚本自身名称main.py,第一个传入的参数对应sys.argv[1]:
import sys # 读取传入的文件名参数 file_name = sys.argv[1] # 后续所有input()读取交互输入的逻辑都可以正常运行,不会触发EOF错误 user_input = input("请输入操作指令:")
如果你有特殊场景必须通过标准输入传递文件名,同时保留后续交互能力,需要在Python读完文件名参数后,把标准输入重新绑定到当前终端,但这种方案兼容性极差,在无tty的非交互环境下会直接报错,非必要不要使用:
- Bash侧通过管道传入文件名:
echo "$1" | python main.py
- Python侧读完参数后重绑stdin到终端:
import sys import os # 读取第一行拿到传入的文件名 file_name = sys.stdin.readline().strip() # 重定向标准输入到当前终端,恢复交互输入能力 sys.stdin = open(os.ttyname(0), 'r') # 后续input()可正常使用 user_input = input("请输入操作指令:")
内容的提问来源于stack exchange,提问作者Yaver Javid
相关产品推荐
相关产品推荐

