Python:在命令完成前从check_output获取响应

1 投票
1 回答
1694 浏览
提问于 2025-04-18 08:47

我正在使用Python来运行Youtube-dl,这是一款用来从YouTube和其他网站下载视频的软件。我主要是用它来下载YouTube视频的音频。我通过使用check_output()来执行保存在我电脑上的youtube-dl.exe文件,从而成功下载了YouTube视频的音频。

下面是我写的一个方法,用来执行youtube-dl文件并下载一首歌。这个方法会返回一大串文本,这些文本是youtube-dl程序的输出结果。

from subprocess import check_output

#downloads the audio from a song to wherever the python script is
def getSong(songUrl):
    return check_output('C:\Users\Ben\Desktop\youtube-dl\youtube-dl.exe --max-quality FORMAT --extract-audio ' + songUrl, shell=True)

当我在Python中运行这个方法时,它会等到命令完成后,再返回一大堆信息。这些信息包括下载结束时的一些常规信息,但如果是在命令提示符下运行,它还会每隔几秒钟提供一次下载进度的信息。问题是,当我在Python中运行时,所有的进度信息都是在下载完成后才显示出来的。

有没有办法在check_output()方法运行时就获取输出信息?这样我就可以为下载制作一个进度条。

编辑:

更新:下面是我目前的代码,基本上可以按照我想要的方式工作,但有一个小问题...

import subprocess
songUrl = "http://www.youtube.com/watch?v=uO3lN-hugaQ"
process = subprocess.Popen(["C:\Users\Ben\Desktop\youtube-dl\youtube-dl.exe", "--max quality", "FORMAT", "--extract-audio", songUrl], shell=True, stdout = subprocess.PIPE)

for line in iter(process.stdout.readline, b''):
    print line,
process.communicate()

当我运行上面的新代码时,它会开始逐行打印出执行命令时生成的信息,但关于下载百分比的信息却都是在最后才打印出来。当我尝试在命令提示符中运行同样的命令时,我发现关于下载百分比的信息其实是每秒钟更新一次,而不是像我在Python中看到的那样每次都生成新的一行。你觉得有没有办法解决这个问题,以便我能获取到制作进度条所需的信息?

1 个回答

3

使用Popen来替代。这样你可以做类似下面的事情:

import subprocess
process = subprocess.Popen(["C:\Users\Ben\Desktop\youtube-dl\youtube-dl.exe", "--max-quality", "FORMAT", "--extract-audio", "songUrl"], shell=True, stdout = subprocess.PIPE)

while process.poll() is None:
    result = process.stdout.read()
    # do some calculations for percentage done

另外,一般来说,尽量避免使用shell=True,这样可以防止潜在的安全问题。

撰写回答