【发布时间】:2013-07-15 18:47:17
【问题描述】:
我有一个 python 脚本,它使用 subprocess 模块打开一个 .exe 程序。这个 .exe 程序是一个无限迭代的脚本,它会继续打印每次迭代的结果,直到用户关闭窗口。每隔一段时间,它就会将迭代的结果打印到一个文件中,替换文件中之前的数据。
我的目标是:
- 运行 .exe 程序,并测试它输出的文件是否存在。
- 一旦文件显示存在,我需要对文件运行测试以查看迭代是否收敛到给定容差范围内。迭代收敛后,我需要终止 .exe 子进程。
这是我当前的代码。它旨在在创建迭代文件后终止子进程:
import subprocess
from subprocess import Popen, PIPE
fileexists = False
iteratecomms = Popen('iterate.exe', stdout=PIPE, stdin=PIPE, stderr=PIPE)
# Begin the iteration. Need to select options 1 and then 1 again at program menu
out, err = iteratecomms.communicate("1\n1\n".encode())
while (fileexists == False):
fileexists = os.path.exists(filelocation)
else:
Popen.kill(iteratecomms)
我知道这是不正确的;问题是,只要我启动out, err = iteratecomms.communicate("1\n1\n".encode()) 行,程序就会开始迭代,并且不会继续执行下一组python 代码。本质上,我需要启动 .exe 程序,同时测试文件是否已创建。但是,我不能这样做,因为程序会无限期地运行。
我该如何解决这个问题?我假设继续进行第 2 步(在某些条件下测试文件并终止子进程)不会在此之上花费太多工作;如果这不是真的,我将如何完成我的所有目标?
非常感谢您的帮助!
编辑:澄清外部文件已被覆盖。
【问题讨论】:
-
避免挂断
communicate("1\n1\n".encode()),而是致电Popen.stdin.write("1\n1\n".encode())。 -
这行得通(当我用
iteratecomms替换Popen时);谢谢你!您知道如何使用iteratecomms.stdout.read()之类的东西连续打印 .exe 程序的输出吗? -
在我的脑海中,我设置了一个单独的线程,通过
iteratecomms.stdout.read()连续读取行并将它们放入主线程检查并检索它们的Queue。这个单独的线程在不再需要时很容易被杀死。 -
另外,Non-blocking read on a subprocess.PIPE in python 问题的答案可能对您有所帮助。 (或者至少让你知道要寻找什么样的东西)。
标签: python subprocess popen