如何通过Python子进程自动响应Azure CLI交互式输入?
解决Azure CLI交互式命令的自动输入问题
你需要用Python脚本自动执行Azure CLI创建流水线的命令,避免手动选择服务连接,之前用subprocess的input参数时遇到NoTTYException,可以用以下两种方法解决:
方法1:直接指定服务连接(推荐)
Azure CLI的az pipelines create命令支持通过--service-connection参数直接指定服务连接名称,完全跳过交互式提示,这是最可靠的方式。
修改后的Python代码:
import subprocess # 替换<org>、<project>、<path to pipeline>、<my connection name>为实际值 cmd = '''az pipelines create --name pipeline-from-cli --repository https://github.com/<org>/<project> --yml-path <path to pipeline>.yaml --folder-path _poc-area --service-connection "<my connection name>"''' subprocess.run(cmd, shell=True, check=True)
方法2:模拟TTY终端交互(如果无法用参数指定)
如果必须通过选择序号完成交互,由于Azure CLI会检查是否存在TTY终端,subprocess无法满足,可使用pexpect库模拟终端环境:
- 先安装pexpect:
pip install pexpect
- 编写脚本:
import pexpect # 替换占位符为实际值 cmd = 'az pipelines create --name pipeline-from-cli --repository https://github.com/<org>/<project> --yml-path <path to pipeline>.yaml --folder-path _poc-area' # 启动子进程并等待提示 child = pexpect.spawn(cmd) child.expect('Please enter a choice') # 自动输入2并回车 child.sendline('2') # 等待命令执行完成 child.expect(pexpect.EOF) # 打印输出结果 print(child.before.decode('utf-8'))
错误原因说明
你之前遇到的NoTTYException是因为Azure CLI检测到当前环境没有TTY终端(subprocess默认不会创建TTY),因此拒绝进行交互式输入。pexpect会创建模拟的终端环境,让CLI认为是在交互式终端中运行,从而接受输入。
内容的提问来源于stack exchange,提问作者agw2021
相关产品推荐
相关产品推荐

