Непонятно, что вы пытаетесь сделать. Вы просто пытаетесь объединить приложения вместе, то есть когда первое приложение заканчивается, оно вызывает второе приложение, а когда второе заканчивается, оно вызывает первое и т. Д.? Если это так, то вам просто нужно, чтобы одно приложение порождало другое и немедленно выходило, а не ожидало. Взгляните на subprocess.Popen
, что позволяет вам это делать (subprocess.call
всегда ждет).
Однако, похоже, что вы хотите, чтобы первое приложение продолжало работать, но чтобы сбросить настройки, когда второй заканчивается. В этом случае второе приложение на самом деле является потомком первого. В первом случае вы можете проверить, закончилась ли вторая после вызова Popen
, используя poll
; затем, когда второй закончен, сначала запустите приложение, а затем выйдите, как описано выше, используя Popen
. Если вы хотите, чтобы он работал асинхронно, вы можете создать отдельный поток в первом приложении, которое вызывает wait
, а затем выйдет; но в этом случае вы должны быть осторожны с синхронизацией. Я не могу сказать больше, потому что я не знаю, что делает первое приложение во время второго запуска.
Если вы хотите, чтобы второе приложение продолжало работать, но отправьте сигнал обратно в первое приложение, которое также работает, создайте канал между ними, так что, когда ребенок записывает его в стандартный вывод, он фактически записывает трубу, которую родитель может прочитать. Если родитель (первое приложение) может блокировать ожидание второго приложения, чтобы закончить делать то, что он делает, то вы просто сделать это:
p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE)
str = p.stdout.readline()
Затем вызов readline
будет блокировать до второй программы принтов что-то вне (например, строка, содержащая только «done»), в которой str
в первой программе будет содержать строку, распечатанную второй программой.
Если вам нужно, чтобы первая программа выполняла что-то еще в одно и то же время и периодически опробовала трубу неблокирующим способом, становится сложнее. Взгляните на этот ответ на решение, которое работает как на Unix и Windows:
Non-blocking read on a subprocess.PIPE in python
не специфичны для Python, но как сделать 'second' дитя' first', а затем ждать 'second' завершить? Это сделало бы общение между приложениями тривиальным. – tuscland
@tuscland Cant сделал это, потому что 'second' обновляет первое приложение (' first' нужно закрыть в этом случае). – Lucas
@ Лукас Вам нужна какая-либо сигнализация выше и выше знаний о том, что предыдущее приложение завершено? – John1024