2016-04-28 52 views
1

下面的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發生

    1. 同樣的行爲。
    2. 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版本。

    謝謝你的幫助!

  • 回答

    0

    我發現ffmpeg在異步運行時會阻塞自己。郵件列表顯示使用nohup可以避免這個問題。有興趣的人請參閱here

    1

    當shell = False時會發生同樣的事情嗎?使用shell = False時,必須指向可執行文件的直接路徑。

    +0

    是的,完全一樣的行爲;同步任務成功完成,異步任務與子ffmpeg進程一起停止。 – Suriname0

    +0

    使用'proc.communicate()'而不是'proc.poll()'怎麼樣?刪除while循環,並設置'status = proc.communicate()',並用'proc.returncode'獲取返回碼。請注意'communic()'是阻塞的。 – 10se1ucgo

    +0

    是的,我也試過'溝通()';同樣的行爲。 – Suriname0