在python子流程中捕获批处理文件用户提示
我试图从python脚本执行一个批处理文件,使用python脚本作为批处理文件的“前端”。(说来话长,也不相关。) 但是,批处理文件中包含质询和响应,类似于:在python子流程中捕获批处理文件用户提示,python,batch-file,python-3.x,cmd,subprocess,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脚本中的提示,然后检查脚本是否再次提示(即输入错误),或者是否通过
:star
set /p var=Enter The Value:%=%
@echo %var%
if %var%!=%other_var% goto :star
因此,基本上,它会提示用户输入,然后检查输入是否正确,如果不正确,则会提示用户不要输入
如何读取python脚本中的提示,然后检查脚本是否再次提示(即输入错误),或者是否通过了提示?我目前正在使用subprocess的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实例
有什么想法吗
编辑2:
我很想拥有像pexpect for Windows这样的东西,但是,我能找到的唯一一个似乎是几年前最后一次更新的,在Windows 7或更高版本上没有完全的功能。你可以尝试:
对于iter中的行(process.stdout.readline,b'):process.stdin.write(“foo\n”if random.random()<.99 else“other\n”)
如果存在缓冲问题,它可能会失败。它确实会失败。老实说,我不太确定批处理文件方面发生了什么;批处理文件不是我的事。此外,.write('foo\n')
失败,原因是str不支持缓冲区接口
。它必须是b'foo\n'
,一个字节字符串。@Fimagzen:1。尝试使用批处理文件。我不知道批处理文件在哪里打印它们的提示符(它们可以直接打印到控制台,putwch
),也不知道它们在哪里接受输入(getwch
)。将命令传递给cmd.exe与接受批处理文件中的输入不同。虽然它也可能失败2。如果希望得到Python 3答案,则必须指定标记。3.为什么要使用shell=True
?1。我用cmd.exe和批处理文件都试过了,但没有用。2.请注意,我已经这样做了。3.我在有和没有shell=True
的情况下都试过了,以防万一会有所不同。正如我所说,我真的不太确定批处理文件方面发生了什么。1包含尝试运行批处理文件并删除所有其他内容的相关代码非常有用。2.如果您尝试过,请指定失败的具体方式。