子进程调用停止异步执行的Python父进程

时间:2016-04-28 18:25:15

标签: python bash ffmpeg python-2.6

以下shell会话演示了我看到的行为:

[user@compname python-test]$ cat test.py
#!/usr/bin/env python
import subprocess
from time import sleep
proc = subprocess.Popen("ffmpeg", stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
print "Starting process: " + str(proc)
status = proc.poll()
while status is None:
    print "Process still running."
    sleep(0.01)
    status = proc.poll()
print "Status: " + str(status)
[user@compname python-test]$ python test.py
Starting process: <subprocess.Popen object at 0x7f2893f27150>
Process still running.
Process still running.
Status: 1
[user@compname python-test]$ python test.py &
[4] 6976
[user@compname python-test]$ Starting process: <subprocess.Popen object at 0x7ffa0ea82150>
Process still running.
Process still running.
[4]+  Stopped                 python test.py
[user@compname python-test]$ ps
  PID TTY          TIME CMD
 4684 pts/101  00:00:00 python
 4685 pts/101  00:00:00 ffmpeg
 7183 pts/101  00:00:00 ps
14385 pts/101  00:00:00 bash

正如您所看到的,当简单测试Python程序正常运行时,它会成功完成。当它以异步方式运行时(使用&),一旦子进程调用完成就会停止Python进程(poll()将返回非None值。

  1. 使用Popen.wait()
  2. 时会出现相同的行为
  3. 此行为是ffmpeg唯一的。
  4. Python进程和ffmpeg最终都停止了,如调用ps中所示。
  5. 有人可以帮助我纠正这种行为吗?我没有在subprocess模块,bash的&运算符或ffmpeg的文档中看到任何可以解释这一点的内容。

    Python版本是2.6.6,bash是GNU bash版本4.1.2(1)-release(x86_64-redhat-linux-gnu),ffmpeg是版本3.0.1-static。

    感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

当shell = False时是否会发生同样的事情?使用shell = False时,您必须指向可执行文件的直接路径。

答案 1 :(得分:0)

我发现ffmpeg在异步运行时会阻塞自身。邮件列表显示使用nohup可以避免此问题。有兴趣的人请参见here