如何让Python的sh模块执行需交互输入的脚本?
解决sh模块运行交互式Shell脚本无法接收输入的问题
我明白你遇到的困扰——用Python的sh模块运行需要用户输入的脚本时,子进程没法获取你的输入,这是因为默认情况下sh没有把子进程的标准输入和当前Python进程的终端输入关联起来。下面给你两种可行的解决方案:
方法1:启用交互式模式(适合手动输入场景)
sh模块提供了_interactive=True参数,它会让子进程的stdin、stdout、stderr直接绑定到父进程的对应流,这样你就能像直接在终端运行脚本一样输入内容了。
修改后的代码如下:
import sh cmd = sh.Command('./hello.sh') # 启用交互式模式,让脚本可以接收终端输入 cmd(_interactive=True)
运行这段代码后,你会看到脚本的提示,直接输入名字就能得到回应,完全和在终端执行./hello.sh的体验一致。这个方案也适用于你提到的带--step选项的Ansible playbook,能保持完整的交互会话。
方法2:程序化传递输入(适合自动脚本场景)
如果不需要手动输入,而是想在代码里直接传递输入内容,可以用_in参数把输入字符串传给子进程的stdin:
import sh cmd = sh.Command('./hello.sh') # 直接传递输入内容,不需要手动输入 output = cmd(_in="Alice\n") print(output)
运行这段代码会直接输出Hello Alice,适合自动化场景下不需要人工干预的情况。
为什么原来的代码不行?
你之前的代码用了_iter=True和_iter_noblock=True来捕获输出,但没有处理stdin的连接问题。子进程的stdin默认没有关联到终端,所以即使你在终端输入,内容也不会传到子进程里,自然没法完成交互。
内容的提问来源于stack exchange,提问作者arod
相关产品推荐
相关产品推荐

