以下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
值。
Popen.wait()
ffmpeg
唯一的。ffmpeg
最终都停止了,如调用ps
中所示。有人可以帮助我纠正这种行为吗?我没有在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。
感谢您的帮助!
答案 0 :(得分:1)
当shell = False时是否会发生同样的事情?使用shell = False时,您必须指向可执行文件的直接路径。
答案 1 :(得分:0)
我发现ffmpeg
在异步运行时会阻塞自身。邮件列表显示使用nohup
可以避免此问题。有兴趣的人请参见here。