python 使用 subprocess 实现交互式命令的非交互式执行

背景

想要定时执行某些脚本, 但是脚本是交互式的, 例如下面的bat 脚本

@echo off

set /p name=Name:
echo Name is %name%

echo exit
set /p bye=Bye:
echo Bye is %bye%

需要先输入Name, 在看到 exit 后在输入 Bye, 然后程序退出.

解决方案

使用subprocess 来实现

import subprocess
import time

args = ['cmd', '/c', 'test.bat']
p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)

## 写入一个Name
p.stdin.write('jjj\n')
p.stdin.flush()
## 每次输入后要等一下, 不然下次输入进不去
time.sleep(1)

# 实时获取输出
for line in iter(p.stdout.readline, ''):
    line_data = line.strip()
    print(line_data)
    ## 依据判断, 看到 exit 了,写入 Bye
    if "exit" in line_data:
        p.stdin.write('nice\n')
        p.stdin.flush()

p.stdin.close()
output, error = p.communicate()
print(output)
print(error)

执行结果:
在这里插入图片描述
获取到了, python中的输入, 同时脚本也执行完毕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值