Python / Batch:使用Python按任意键继续

时间:2013-06-18 16:15:23

标签: python batch-file python-3.x automation

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

对我来说似乎最奇怪的部分是,firstwith first arg必须是字节或字节元组,而不是str。我查了一下文档,它肯定应该是一个字符串? tutorial of startswith

所以我在网上找了this一点点。

  

错误消息似乎是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.

我认为这与this错误有关。

我无法想象我想做的事情是与众不同的。由于这似乎比预期的要复杂一些,我想说我使用的是XP和Python 3.3版。

4 个答案:

答案 0 :(得分: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 :(得分:1)

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

请参阅此主题:read subprocess stdout line by line特别是他发布的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;

答案 2 :(得分:0)

正如 OP 中所述,没有一个解决方案能够解决问题。所以最后 Bryce 的解决方案为我解决了这个问题:

subprocess.call([path + '\\' + batchFile, path + '\\' + DIABFile], stdin=subprocess.DEVNULL)

答案 3 :(得分:-1)

enter image description here的解决方案对我有用:

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

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