4

我正在使用 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.

对我来说最奇怪的部分是开头的第一个 arg 必须是字节或字节元组,而不是 str。我查看了文档,它肯定应该是一个字符串?开始教程

所以我上网查了一下,发现一点。

该错误消息似乎是 Python 中的一个错误,因为它正好相反。但是,这里没有问题,在 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 版。

4

4 回答 4

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')
于 2013-06-18T16:22:39.473 回答
1

您可以解析子流程的输出并匹配“按任意键继续”短语以继续。

请参阅此线程:逐行读取子进程标准输出,尤其是他发布为 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;
于 2013-06-18T16:24:10.417 回答
0

如 OP 中所述,没有一个解决方案可以解决问题。所以最后布莱斯的解决方案为我解决了这个问题:

subprocess.call([path + '\\' + batchFile, path + '\\' + DIABFile], stdin=subprocess.DEVNULL)
于 2021-05-19T15:51:22.827 回答
-1

这篇文章的解决方案对我有用:

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

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

于 2020-06-04T21:24:34.577 回答