2014-01-05 4 views
1

Что я хотел бы сделать, это какое-то связь между двумя приложениями:Отправка сигналов между двумя приложениями

first приложения будет работать и вызвать second приложения (первое приложение будет закрыто), а затем, если second приложения закончил свою работу, я хотел бы отправить какой-то сигнал в приложение first и запустить его снова (второе приложение будет закрыто на этот раз).

Единственная идея, которую я получил, это написать файл, когда приложение second завершило свое задание и зарегистрировало приложение first, если файл существует ... есть ли другой способ сделать это?

+0

не специфичны для Python, но как сделать 'second' дитя' first', а затем ждать 'second' завершить? Это сделало бы общение между приложениями тривиальным. – tuscland

+0

@tuscland Cant сделал это, потому что 'second' обновляет первое приложение (' first' нужно закрыть в этом случае). – Lucas

+0

@ Лукас Вам нужна какая-либо сигнализация выше и выше знаний о том, что предыдущее приложение завершено? – John1024

ответ

0

Непонятно, что вы пытаетесь сделать. Вы просто пытаетесь объединить приложения вместе, то есть когда первое приложение заканчивается, оно вызывает второе приложение, а когда второе заканчивается, оно вызывает первое и т. Д.? Если это так, то вам просто нужно, чтобы одно приложение порождало другое и немедленно выходило, а не ожидало. Взгляните на 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

+0

Имейте в виду, что приложение 'second' обновляет' first', поэтому мне нужно будет выйти из него, чтобы «второе» приложение перевернуло «первый». Вот как это получится: откройте приложение 'first' -> закрыть -> открыть второе приложение -> обновить первое приложение -> закрыть второе приложение -> запустить первое приложение. – Lucas

+0

Я до сих пор не совсем понимаю. Первый работает, когда второй работает, или нет? Вы говорите «закрыть», что предполагает, что первое приложение не запускается при открытии второго, но затем «обновить первое приложение», которое предполагает, что он работает *. Можете ли вы объяснить, что именно делают два приложения? –

+0

Кстати, вы должны объяснить, как вы хотите, чтобы он действовал, а не как он мог действовать в соответствии с каким-то описанием, которое я вам дал. –

Смежные вопросы