我正在使用一个python脚本来自动化一个涉及批处理文件的过程。 这些批处理文件是用于其他应用程序的,我不允许编辑它们。
在批处理文件结束时,它提示如下。
"请按任意键继续..."
我如何使用python来识别这个提示出现的时间,以及如何响应它? 我希望能够关闭文件,以便运行下一个批处理文件。
目前我已经找到了下面的解决方案,但它很糟糕,让我觉得心里很脏。
#Run the batch file with parameter DIABFile
subprocess.Popen([path + '\\' + batchFile, path + '\\' + DIABFile])
#Sit here like an idiot until I'm confident the batch file is finished
time.sleep(4)
#Press any key
virtual_keystrokes.press('enter')
有什么好办法吗?
p = subprocess.Popen([path + '\\' + batchFile, path + '\\' + DIABFile],
bufsize=1, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
while p.poll() is None:
line = p.stdout.readline()
print(line)
if line.startswith('Press any key to continue'):
p.communicate('\r\n')
导致以下输出和错误。
b'\r\n'
Traceback (most recent call last):
File "C:\workspace\Perform_QAC_Check\Perform_QAC_Check.py", line 341, in <module>
main()
File "C:\workspace\Perform_QAC_Check\Perform_QAC_Check.py", line 321, in main
run_setup_builderenv(sandboxPath, DIABFile)
File "C:\workspace\Perform_QAC_Check\Perform_QAC_Check.py", line 126, in run_setup_builderenv
if line.startswith('Press any key to continue'):
TypeError: startswith first arg must be bytes or a tuple of bytes, not str
The process tried to write to a nonexistent pipe.
在我看来最奇怪的部分是 startswith第一个参数必须是字节或字节的元组,而不是str。 我查了一下文档,肯定应该是一个字符串?tutorial of startswith
于是我在网上找了一下,发现 这个 一点点。
错误信息似乎是Python中的一个bug,因为它完全是反过来的。但这里还是没有问题,在indian.py中的第75行后面加上
try:
line = line.decode()
except AttributeError:
pass
我就这样做了。
p = subprocess.Popen([path + '\\' + batchFile, path + '\\' + DIABFile],
bufsize=1, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
while p.poll() is None:
line = p.stdout.readline()
print(line)
try:
line = line.decode()
if line.startswith('Press any key to continue'):
p.communicate('\r\n')
except AttributeError:
pass
结果输出如下。
b'\r\n'
b'Build Environment is created.\r\n'
b'\r\n'
b'Please Refer to the directory: C:/directory\r\n'
b'\r\n'
然后它就挂在那里... 这是 "请按任意键继续 "之前的最后一个输出,但它从未出现。
此后,我采取了第二个脚本,并要求它找到 "请参考",它做到了。 不幸的是,然后脚本又在这一行挂起。
p.communicate('\r\n')
结束程序,再次打印出错误。
The process tried to write to a nonexistent pipe.
我相信这与 这个 虫子。
我无法想象我正在做的事情是那么的不寻常。 由于这似乎比预期的要复杂一些,我想说我使用的是XP和Python 3.3版本。
像下面这样的东西应该可以用。
p = subprocess.Popen([path + '\\' + batchFile, path + '\\' + DIABFile],
bufsize=1, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
while p.poll() is None:
line = p.stdout.readline()
if line.startswith('Press any key to continue'):
p.communicate('\r\n')
你可以解析子进程的输出 然后在 "按任意键继续 "的短语上进行匹配,继续进行。
请看这个帖子。逐行读取子进程的stdout。 特别是他发布的Update2的内容
它可能是这样的。
import subprocess
proc = subprocess.Popen([path + '\\' + batchFile, path + '\\' + DIABFile],stdout=subprocess.PIPE)
for line in iter(proc.stdout.readline,''):
if (line.rstrip() == "Press any key to..":
break;
解决办法是: 此职位 为我工作。
尝试执行
cmd.exe /c YourCmdFile < nul
YourCmdFile
- 您的批处理脚本的完整路径