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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:51:22