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

Python 在两个应用程序之间发送信号,python,signals,communication,Python,Signals,Communication,我想做的是在两个应用程序之间进行某种通信: 第一个应用程序将运行并调用第二个应用程序第一个应用程序将关闭,然后如果第二个应用程序已完成其工作,我想发送一些信号给第一个应用程序,并再次启动它第二个应用程序将关闭这一次 我唯一的想法是在第二个应用程序完成其工作后写入一个文件,并在第一个应用程序中检查该文件是否存在。。。还有其他方法吗?有点不清楚你想做什么。您是否只是试图将应用程序链接在一起,即当第一个应用程序完成时调用第二个应用程序,当第二个应用程序完成时调用第一个应用程序,等等。?如果这是真的,那

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

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


我唯一的想法是在第二个应用程序完成其工作后写入一个文件,并在第一个应用程序中检查该文件是否存在。。。还有其他方法吗?

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

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

如果您希望第二个应用程序继续运行,但将信号发送回也在运行的第一个应用程序,请在这两个应用程序之间创建一个管道,以便当子应用程序写入其标准输出时,它实际上正在写入一个管道,父应用程序可以读取该管道。如果第一个应用程序的父应用程序能够阻止等待第二个应用程序完成其正在执行的操作,则只需执行以下操作:

p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE)
str = p.stdout.readline()
然后,对readline的调用将被阻止,直到第二个程序打印出某个内容(例如,刚刚包含done的行),此时第一个程序中的str将包含第二个程序打印出的行

如果您需要第一个程序同时执行其他操作,并以非阻塞方式定期轮询管道,那么它会变得更加棘手。请查看此答案,了解同时在Unix和Windows上工作的解决方案:


不是特定于Python的,但是让second成为first的子对象,然后等待second完成呢?这会使应用程序间的通信变得微不足道。@Tuskland无法做到这一点,因为第二个应用程序正在更新第一个应用程序,所以在这种情况下,必须首先关闭。@Lucas您是否需要任何超出前一个应用程序已完成的知识范围的信号?请记住,第二个应用程序正在更新第一个应用程序,因此我必须退出它,以便让第二个应用程序超越第一个应用程序。下面是它将如何运行:打开第一个应用->关闭->打开第二个应用->更新第一个应用->关闭第二个应用->运行第一个应用。我仍然不完全理解。第一个正在运行,而第二个正在运行,还是没有?当第二个应用程序被打开时,你可以说关闭,这表明第一个应用程序没有运行,然后更新第一个应用程序,这表明它正在运行。你能解释这两个应用程序到底在做什么吗?顺便说一句,你应该解释你希望它如何运行,而不是根据我给你的一些描述它可能会如何运行。不,当第一个应用程序运行时,第二个应用程序默认关闭,第一个应用程序运行第二个应用程序。当seconds函数done`返回true时,它应该打开第一个函数,发送一个信息,表明done为true,然后第一个应用程序将进行其他工作。好的,这是一个图形应用程序吗?你在Windows上吗?您需要澄清,当您说关闭时,您是指流程存在但窗口关闭,还是流程不存在?当第二个操作完成时,这是否意味着进程退出,或者窗口只是关闭,但进程仍然存在?假定流程应该退出,在这种情况下,第一个流程将自动得到通知。请记住,如果第一个应用程序的进程正在运行,它的窗口是否关闭并不重要——第一个应用程序只需重新打开自己的窗口即可。