Python 通过子进程终止comand并执行

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()是一个阻塞调用-它等

我有一个python脚本,它监听特定的流并将其记录如下:

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)