У меня есть сценарий python, который открывает программу .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())
. - person martineau   schedule 16.07.2013Popen
наiteratecomms
); благодарю вас! Не могли бы вы представить себе, как непрерывно печатать вывод программы .exe, используя что-то вродеiteratecomms.stdout.read()
? - person Bixx   schedule 16.07.2013iteratecomms.stdout.read()
и помещал их в _ 2_, из которой основной поток проверял и извлекал их. Этот отдельный поток можно легко убить, когда он больше не нужен. - person martineau   schedule 16.07.2013