如何运行Python的子流程并将其留在后台

时间:2016-01-11 09:57:10

标签: python subprocess popen

我看过很多关于我话题的帖子,但实际上我找不到解决问题的方法。 我正在尝试在后台运行子进程,而不等待子进程执行。被调用的子进程是一个shell脚本,它执行许多不同的操作。 这是我的一小段代码:

print "Execute command:", full_command
subprocess.Popen(full_command, stdin=None, stdout=None, stderr=None, close_fds=True).communicate()
print "After subprocess"

我的问题是Python等到subprocess.Popen完成它的工作。我读过,stdin(-out,-err)=无应该解决这个问题,但事实并非如此。另外close_fds = True,在这里没有帮助。

2 个答案:

答案 0 :(得分:7)

来自Popen.communicate documentation(强调我的):

  

与流程交互:将数据发送到stdin。从stdout和。读取数据   stderr,直到达到文件结尾。 等待进程终止。   可选的输入参数应该是要发送给子级的字符串   如果没有数据应该发送给孩子,则处理或无。

如果您不想等待该流程终止,请暂时不要致电communicate

subprocess.Popen(full_command, close_fds=True)

答案 1 :(得分:1)

可能是另一种实现方法,它具有从github.com/hologram-io/hologram-python pppd.py文件中检查子进程输出一段时间的可选功能:

    self.proc = Popen(self._commands, stdout=PIPE, stderr=STDOUT)

    # set stdout to non-blocking
    fd = self.proc.stdout.fileno()
    fl = fcntl.fcntl(fd, fcntl.F_GETFL)
    fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)