PythonBatch。使用Python按任意键继续

问题描述 投票:3回答:3

我正在使用一个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')

有什么好办法吗?

尝试1

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

我就这样做了。

尝试#2

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版本。

python batch-file python-3.x automation
3个回答
4
投票

像下面这样的东西应该可以用。

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')

1
投票

你可以解析子进程的输出 然后在 "按任意键继续 "的短语上进行匹配,继续进行。

请看这个帖子。逐行读取子进程的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;

0
投票

解决办法是: 此职位 为我工作。

尝试执行 cmd.exe /c YourCmdFile < nul

YourCmdFile - 您的批处理脚本的完整路径

© www.soinside.com 2019 - 2024. All rights reserved.