Python:Popen-等待主进程,但不等待后台子进程

Python:Popen-等待主进程,但不等待后台子进程,python,subprocess,Python,Subprocess,我在Unix中工作,我有一个“通用工具”,可以在后台加载另一个进程(GUI实用程序)并退出 我从Python脚本调用我的“通用工具”,使用Popen和proc.communicate()方法 我的“通用工具”运行约1秒,在后台加载GUI进程,并立即退出 问题是proc.communicate()继续等待进程,尽管进程已经终止。我必须手动关闭GUI(这是在BG上运行的子进程),因此proc.communicate()返回 如何解决这个问题 我需要proc.communicate()在主进程终止后返

我在Unix中工作,我有一个“通用工具”,可以在后台加载另一个进程(GUI实用程序)并退出

我从Python脚本调用我的“通用工具”,使用Popen
proc.communicate()
方法

我的“通用工具”运行约1秒,在后台加载GUI进程,并立即退出

问题是
proc.communicate()
继续等待进程,尽管进程已经终止。我必须手动关闭GUI(这是在BG上运行的子进程),因此
proc.communicate()
返回

如何解决这个问题

我需要
proc.communicate()
在主进程终止后返回,而不是等待在后台运行的子进程

谢谢

编辑: 添加一些代码段:

我的“通用工具”最后几行主线(用Perl编写):

运行“通用工具”的我的Python脚本

cmd = PATH_TO_MY_GENERAL_TOOL
proc = subprocess.Popen(cmd, shell = True, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
stdout, dummy = proc.communicate()
exit_code = proc.returncode
if exit_code != 0:
    print 'The tool has failed with status: {0}. Error message is:\n{1}'.format(exit_code, stdout)
    sys.exit(1)

print 'This line is printed only when the GUI process is terminated...'

不要使用
通信
。通信被明确设计为等待进程的stdout关闭。大概perl并没有关闭stdout,因为它将它留给自己的子进程进行写入

您也不需要真正使用
Popen
,因为您没有真正使用它的功能。也就是说,您创建管道,然后用自己的消息重新打印到stdout。看起来你根本不需要贝壳

尝试使用
子流程。调用
甚至
子流程。检查调用

例如

如果进程返回非零退出代码,则无需检查返回值,因为
check\u call
会引发异常(其中包含退出代码)。进程的输出直接写入控制终端——无需重定向输出

最后,如果
cmd
是指向可执行文件的路径及其参数的组合,则使用
shlex.split

例如

要测试的示例代码:

mypython.py

import subprocess, shlex
subprocess.check_call(shlex.split("perl myperl.pl"))
print("finishing top level process")
myperl.pl

print "starting perl subprocess\n";
my $cmd = 'python -c "
import time
print(\'starting python subprocess\')
time.sleep(3);
print(\'finishing python subprocess\')
" &';
system($cmd);
print "finishing perl subprocess\n";
输出为:

$ python mypython.py 
starting perl subprocess
finishing perl subprocess
finishing top level process
$ starting python subprocess
finishing python subprocess

给我们看你的代码不会有什么坏处。是的,让我们分享一些代码吧!您真的确定通用工具已终止吗?我的意思是,如果运行
ps
(在Linux-Unix上)或任务管理器(在Windows上),它是否仍然存在?应该终止该进程。。。我将分享我的代码。。。
import subprocess, shlex
subprocess.check_call(shlex.split("perl myperl.pl"))
print("finishing top level process")
print "starting perl subprocess\n";
my $cmd = 'python -c "
import time
print(\'starting python subprocess\')
time.sleep(3);
print(\'finishing python subprocess\')
" &';
system($cmd);
print "finishing perl subprocess\n";
$ python mypython.py 
starting perl subprocess
finishing perl subprocess
finishing top level process
$ starting python subprocess
finishing python subprocess