在两个应用程序之间发送信号

时间:2014-01-05 23:09:38

标签: python signals communication

我想做的是两个应用程序之间的某种通信:

first应用程序将运行并调用second应用程序(第一个应用程序将关闭)然后如果second应用程序已完成其工作,我想发送某种信号给first应用程序并再次启动它(这次将关闭第二个应用程序)。

我得到的唯一一个想法是写入文件,当second应用程序完成其工作并检查first应用程序时文件是否存在...是否有其他方式这样做?

1 个答案:

答案 0 :(得分:0)

有点不清楚你要做什么。你只是试图将应用程序链接在一起,即当第一个应用程序完成时它调用第二个应用程序,当第二个应用程序完成时它调用第一个应用程序,等等?如果这是真的,那么你只需要让一个应用程序产生另一个并立即退出而不是等待。请查看subprocess.Popen,这样您就可以执行此操作(subprocess.call始终等待)。

然而,听起来好像你想要第一个应用程序继续运行,但是当第二个应用程序完成时重置自己。在这种情况下,第二个应用程序实际上是第一个应用程序的子代。在第一个中,您可以使用Popen在调用poll后检查第二个是否已完成;然后,当第二个完成时,让第一个应用程序重新生成然后退出,就像上面使用Popen所述。如果您希望它以异步方式工作,您可以在调用wait的第一个应用程序中创建一个单独的线程,然后退出;但在这种情况下你必须小心同步。我不能多说,因为我不知道第二个应用程序在第二个应用程序运行时的作用。

如果你希望第二个应用程序继续运行但是将信号发送回第一个同时运行的应用程序,则在两者之间创建一个管道,这样当孩子写入stdout时,它实际上是写入一个管道,父母可以阅读。如果您的父(第一个应用程序)能够阻止等待第二个应用程序完成正在执行的操作,那么您只需执行此操作:

p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE)
str = p.stdout.readline()

然后,对readline的调用将阻塞,直到第二个程序打印出某些东西(例如,一行只包含“完成”),此时第一个程序中的str将包含打印的行由第二个计划出来。

如果您需要第一个程序同时执行其他操作,并以非阻塞方式定期轮询管道,则会变得更加棘手。看看这个答案,找到一个适用于Unix和Windows的解决方案:

Non-blocking read on a subprocess.PIPE in python