Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python子流程中捕获批处理文件用户提示_Python_Batch File_Python 3.x_Cmd_Subprocess - Fatal编程技术网

在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脚本中的提示,然后检查脚本是否再次提示(即输入错误),或者是否通过

我试图从python脚本执行一个批处理文件,使用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.如果您尝试过,请指定失败的具体方式。