下面的shell會話演示,我看到的行爲:子過程調用停止異步執行的Python的父進程
[[email protected] 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)
[[email protected] python-test]$ python test.py
Starting process: <subprocess.Popen object at 0x7f2893f27150>
Process still running.
Process still running.
Status: 1
[[email protected] python-test]$ python test.py &
[4] 6976
[[email protected] python-test]$ Starting process: <subprocess.Popen object at 0x7ffa0ea82150>
Process still running.
Process still running.
[4]+ Stopped python test.py
[[email protected] 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
發生
- 同樣的行爲。
- Python進程和
ffmpeg
都停止了,如調用ps
所示。
有人可以幫我解決這個問題嗎?我在subprocess
模塊,bash的&
運算符或ffmpeg
的文檔中沒有看到任何內容,可以解釋這一點。
Python版本是2.6.6,bash是GNU bash version 4.1.2(1)-release(x86_64-redhat-linux-gnu),ffmpeg是3.0.1-static版本。
謝謝你的幫助!
是的,完全一樣的行爲;同步任務成功完成,異步任務與子ffmpeg進程一起停止。 – Suriname0
使用'proc.communicate()'而不是'proc.poll()'怎麼樣?刪除while循環,並設置'status = proc.communicate()',並用'proc.returncode'獲取返回碼。請注意'communic()'是阻塞的。 – 10se1ucgo
是的,我也試過'溝通()';同樣的行爲。 – Suriname0