2014-02-24 40 views
0

執行我有一個python腳本,它會監聽特定的數據流,並將其記錄是這樣的:終止COMAND由子

subprocess.call(['ffmpeg', '-y', '-i', 'udp://streamurl:streamport', '-acodec', 'copy', '-f', 'mp3', 'filename.mp3']) 

而且它檢查端口7777(當流過它連接到這個端口上的TCP連接我的電腦)我想終止子進程命令每次連接端口7777關閉。我怎樣才能做到這一點?

回答

1
from subprocess import Popen, STDOUT, PIPE 
from time import sleep 

def connected(sock): 
    try: 
     sock.send(b'') 
    except: 
     return False 
    return True 

handle = Popen(['ffmpeg', '-y', '-i', 'udp://streamurl:streamport', '-acodec', 'copy', '-f', 'mp3', 'filename.mp3'], shell=False, stdout=PIPE, stdin=PIPE, stderr=STDOUT) 

output = '' 
while handle.poll() is None and connected(socket): # No exit code given, ergo command still running 
    output += handle.stdout.readline() 
    sleep(0.025) 

if not connected(socket): 
    handle.terminate() 

output += handle.stdout.read() 
handle.stdout.close() 
handle.stdin.close() 
print(output) 

注意:我不知道什麼是「窩」是,但我假設各種各樣的只是一個普通的插座。
我想指出,我絕不是一個完美的程序員,但這會讓你知道你需要做什麼,雖然不完美,這將工作:)

+0

如果'ffmpeg'產生足夠多輸出來填充管道緩衝區,或者如果它從標準輸入讀取,那麼它可能會阻塞並且不執行*。除非要從管道讀取/寫入,否則不要將'stdout/stdin'設置爲'PIPE'。另外'無'是一個單身人士。使用'something是None'而不是'something == None'。 – jfs

+0

@ J.F.Sebastian詳細說明'None',因爲你失去了我..在這種情況下使用'is'和'=='之間的實際區別是什麼? – Torxed

+1

只'無'是'無'。可能有許多對象等於'None'(嘗試它:定義'__eq __(other)'方法,如果other'是'None'則返回'True')。 – jfs

1

subprocess.call()是一個阻塞調用 - 它等待子進程完成。

您可能希望使用subprocess.Popen()代替,該代碼返回Popen object,您可以使用Popen.terminate()進行交互並終止。

查看documentation here