背景
想要定时执行某些脚本, 但是脚本是交互式的, 例如下面的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中的输入, 同时脚本也执行完毕