如何在Bash脚本中使用Python input()函数?解决EOFError报错问题
解决Bash脚本中嵌入Python时input()的EOFError问题
问题重现
你在Bash脚本里用here-doc嵌入Python代码,运行时input()抛出了EOFError,代码大概是这样:
#!/bin/bash python3 <<END print(input(">>> ")) END
问题原因
这是因为当你用here-doc(<<END)的时候,Python的标准输入被绑定到了here-doc的内容流上——当Python执行到input()时,here-doc已经读到END标记结束了,所以input()没有更多输入可读,直接碰到EOF就报错了。
解决方案
这里有几种靠谱的解决办法,看你实际需求选:
1. 让Python直接从终端读取输入(适合交互式场景)
把Python的标准输入重定向到/dev/tty,这是当前终端的设备文件,能让input()直接从终端获取用户输入,而不是从here-doc的流里读:
#!/bin/bash python3 <<END < /dev/tty print(input(">>> ")) END
2. 用Bash先读取输入再传递给Python(适合非交互式或参数传递)
如果不需要实时交互式输入,也可以先在Bash层面读取用户输入,再通过命令行参数或者环境变量传给Python,这样能避免标准输入冲突:
方法A:命令行参数传递
#!/bin/bash read -p ">>> " user_input python3 -c "print('$user_input')"
方法B:环境变量传递
#!/bin/bash read -p ">>> " user_input export USER_INPUT="$user_input" python3 <<END import os print(os.environ['USER_INPUT']) END
总结
如果是需要用户在终端输入的交互式场景,第一种重定向到/dev/tty的方法最直接;如果是要传递预先获取的参数,后面两种方法更稳妥,也能避免输入流冲突的问题。
内容的提问来源于stack exchange,提问作者dildeolupbiten
相关产品推荐
相关产品推荐

