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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:03:20