调用Python2.6读取输入时遇EOFError,请求技术排查
问题分析与解决方案
让我们一步步拆解你的问题并修复:
核心错误原因
你遇到的EOFError: EOF when reading a line是因为here-document的输入占用了Python的标准输入:
当你用python2.6 <<"EOF"时,bash会把EOF之间的所有代码作为标准输入传递给Python进程。当Python执行到input()时,它的标准输入已经被here-document的内容耗尽了,所以直接读到了EOF,触发错误。
除此之外,你的脚本还有两个额外问题:
- Python代码里有拼写错误:
ptint('a=%d ' % a)应该是print。 - Bash的变量
a/b和Python的a/b完全独立——最后bash计算的c是初始值1+2=3,根本不是用户输入的数值。
修复后的完整脚本
下面是一个既能正常读取终端输入,又能把Python获取的数值传递给bash计算总和的版本:
# 捕获Python输出的两个数值 read -r py_a py_b <<< $(python2.6 -c ' try: a = int(raw_input("Enter num 1: ")) b = int(raw_input("Enter num 2: ")) print("a=%d " % a) print("b=%d " % b) # 打印数值给bash捕获 print("%d %d" % (a, b)) except ValueError: print("Invalid input! Please enter integers only.") exit(1) ') # 检查输入有效性并计算总和 if [[ -n "$py_a" && -n "$py_b" ]]; then c=$((py_a + py_b)) echo "Sum of the two numbers: $c" else echo "Error: Failed to retrieve valid numbers." fi
关键改进点
- 替换here-document为
-c参数:
使用python2.6 -c '代码'让Python直接从终端读取输入,避免了here-document占用标准输入的问题。 - 替换
input()为raw_input():
在Python2.6中,input()会把用户输入当作Python代码执行,存在安全风险;raw_input()只会读取字符串,更安全,之后我们再手动转成整数。 - 添加异常处理:
防止用户输入非整数导致脚本崩溃,给出友好提示。 - 变量跨环境传递:
通过Python打印数值,bash用read捕获输出,实现Python和bash之间的变量传递。
备选方案(坚持使用here-document)
如果你一定要用here-document,可以强制Python从终端读取输入(指定< /dev/tty),但注意这种方式没法直接把Python的变量传给bash:
a=1 b=2 python2.6 <<"EOF" < /dev/tty a=int(raw_input('Enter num 1: ')) b=int(raw_input('Enter num 2: ')) print('a=%d ' % a) print('b=%d ' % b) # 注意:这里的a/b和bash的a/b无关 EOF # bash的c还是1+2=3,不是用户输入的数值 c=$((a + b)) echo "$c"
内容的提问来源于stack exchange,提问作者arjun gaur
相关产品推荐
相关产品推荐

