Python 通过子进程终止comand并执行
我有一个python脚本,它监听特定的流并将其记录如下:Python 通过子进程终止comand并执行,python,ffmpeg,streaming,subprocess,Python,Ffmpeg,Streaming,Subprocess,我有一个python脚本,它监听特定的流并将其记录如下: subprocess.call(['ffmpeg', '-y', '-i', 'udp://streamurl:streamport', '-acodec', 'copy', '-f', 'mp3', 'filename.mp3']) 此外,它还会检查端口7777上的tcp连接(当流处于活动状态时,它会连接到我电脑上的此端口)。每次端口7777上的连接关闭时,我都要终止子进程命令。如何执行此操作?子流程。call()是一个阻塞调用-它等
subprocess.call(['ffmpeg', '-y', '-i', 'udp://streamurl:streamport', '-acodec', 'copy', '-f', 'mp3', 'filename.mp3'])
此外,它还会检查端口7777上的tcp连接(当流处于活动状态时,它会连接到我电脑上的此端口)。每次端口7777上的连接关闭时,我都要终止子进程命令。如何执行此操作?子流程。call()
是一个阻塞调用-它等待子流程完成
您可能希望改用subprocess.Popen()
,它返回一个可以使用Popen.terminate()
进行交互和终止的
看
注意:我不知道“套接字”是什么,但我假设只是一个普通的套接字。我想指出的是,我决不是一个完美的程序员,但这会让你知道你需要做什么,尽管这并不完美,但它可以工作:)如果
ffmpeg
生成足够的输出来填充管道缓冲区,或者如果它从stdin读取,那么它可能会阻塞,什么也不做。不要将stdout/stdin
设置为PIPE
,除非您想从管道读/写。另外,None
是一个单例。使用某物为无
而不是某物==无
@J.F.Sebastian请详细说明无
,因为你失去了我。。在这种情况下,使用is
和=
之间的实际区别是什么?只有无
是无
。可能有许多对象等于None
(试试看:如果other
为None
,则定义\uuuuueq\uuuuuu(other)
方法返回True
。@J.F.Sebastian-Gotcha!实际上,我们认为Python会解释和==
对象的类型是相同的。。猜不到:)谢谢你的解释!管道处理是大错特错的handle.stdout.read()
在读取所有输出之前不会返回。我不确定sock.send(b'')
是否有任何作用(这与问题无关。我只想删除connected()
定义。
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)