執行我有一個python腳本,它會監聽特定的數據流,並將其記錄是這樣的:終止COMAND由子
subprocess.call(['ffmpeg', '-y', '-i', 'udp://streamurl:streamport', '-acodec', 'copy', '-f', 'mp3', 'filename.mp3'])
而且它檢查端口7777(當流過它連接到這個端口上的TCP連接我的電腦)我想終止子進程命令每次連接端口7777關閉。我怎樣才能做到這一點?
執行我有一個python腳本,它會監聽特定的數據流,並將其記錄是這樣的:終止COMAND由子
subprocess.call(['ffmpeg', '-y', '-i', 'udp://streamurl:streamport', '-acodec', 'copy', '-f', 'mp3', 'filename.mp3'])
而且它檢查端口7777(當流過它連接到這個端口上的TCP連接我的電腦)我想終止子進程命令每次連接端口7777關閉。我怎樣才能做到這一點?
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)
注意:我不知道什麼是「窩」是,但我假設各種各樣的只是一個普通的插座。
我想指出,我絕不是一個完美的程序員,但這會讓你知道你需要做什麼,雖然不完美,這將工作:)
subprocess.call()
是一個阻塞調用 - 它等待子進程完成。
您可能希望使用subprocess.Popen()
代替,該代碼返回Popen object,您可以使用Popen.terminate()
進行交互並終止。
如果'ffmpeg'產生足夠多輸出來填充管道緩衝區,或者如果它從標準輸入讀取,那麼它可能會阻塞並且不執行*。除非要從管道讀取/寫入,否則不要將'stdout/stdin'設置爲'PIPE'。另外'無'是一個單身人士。使用'something是None'而不是'something == None'。 – jfs
@ J.F.Sebastian詳細說明'None',因爲你失去了我..在這種情況下使用'is'和'=='之間的實際區別是什麼? – Torxed
只'無'是'無'。可能有許多對象等於'None'(嘗試它:定義'__eq __(other)'方法,如果other'是'None'則返回'True')。 – jfs