我看过很多关于我话题的帖子,但实际上我找不到解决问题的方法。 我正在尝试在后台运行子进程,而不等待子进程执行。被调用的子进程是一个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,在这里没有帮助。
答案 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)