我正在使用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.
对我来说似乎最奇怪的部分是,firstwith first arg必须是字节或字节元组,而不是str。我查了一下文档,它肯定应该是一个字符串? tutorial of startswith
所以我在网上找了this一点点。
错误消息似乎是Python中的一个错误,因为它恰恰相反。但是,这里没有问题,在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.
我认为这与this错误有关。
我无法想象我想做的事情是与众不同的。由于这似乎比预期的要复杂一些,我想说我使用的是XP和Python 3.3版。
答案 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)