在python子进程中捕获批处理文件用户提示符

时间:2014-03-25 12:43:00

标签: python batch-file python-3.x cmd subprocess

我正在尝试从python脚本执行批处理文件,使用python脚本作为批处理文件的“前端”,就像它一样。 (这是一个很长的故事,而且不相关。)

但是,批处理文件中包含挑战和响应,如:

:star
set /p var=Enter The Value:%=%
@echo %var%
if %var%!=%other_var% goto :star

基本上,它会提示用户输入,然后检查输入是否正确,如果没有提示用户反对。

如何在我的python脚本中读取提示,然后检查脚本是否再次提示我(IE。输入错误),或者是否通过?我目前正在使用子进程'Popen构造函数,我尝试了一个.stdout.readline()循环,打印每一行,提示根本没有显示。 (循环成功捕获并读取所有行,但不是提示本身。)

我尝试了.communicate(input="foo\n"),这在技术上有效,因为如果foo是预期变量,批处理文件将成功通过。如果没有,它只是锁定并永远等待。

我已经尝试过写入stdin,而这只是简单地锁定了几乎没有迹象表明发生了什么。

我该怎么办?

编辑: 继续进行实验,我尝试打开一个cmd.exe实例,然后运行命令。

import subprocess as sp

p = sp.Popen(["cmd.exe"], stdin=sp.PIPE, stdout = sp.PIPE, shell=True)

print("RUN")

# print(p.communicate(input=b"echo HELLO WORLD\n"))

for i in iter(p.stdout.readline, b''):
    print(str(i))
    p.stdin.write(b'echo HELLO WORLD!')

注释掉的.communicate有效,但同样会阻塞,直到流程结束,这对挑战和回应事物来说并不是一个真正的选择。但是,.readline.stdin接口不会。它打印:

b'Microsoft Windows [Version 6.1.7601]\r\n'
b'Copyright (c) 2009 Microsoft Corporation.  All rights reserved.\r\n'
b'\r\n'

然后阻止那里直到我终止cmd.exe实例。

有什么想法吗?

EDIT2: 我很想拥有像pexpect for Windows这样的东西,然而,我能找到的唯一的东西似乎是几年前的最后一次更新,而且在Windows 7或更高版本上没有完全正常运行。

0 个答案:

没有答案