1

YouTube や他のサイトから動画をダウンロードするために使用されるソフトウェアであるYoutube-dlを実行するために python を使用しています。特にYouTubeビデオからオーディオをダウンロードするために使用しています。check_output() を使用してコンピューターに保存されている youtube-dl.exe ファイルを実行することにより、python を使用して 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() メソッドから出力を取得する方法はありますか? そうすれば、ダウンロードの進行状況バーを作成できます。

編集:

更新:以下は、1つの小さな例外を除いて、私が望むように動作するようになった現在のコードです...

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()

この新しい上記のコードを実行すると、実行されたコマンドで生成された情報が 1 行ずつ出力され始めますが、ダウンロードされた割合に関するすべての情報はすべて最後に出力されます。コマンド プロンプトで同じコマンドを実行してみたところ、ダウンロードされた割合に関する情報を提供するテキストが、更新された情報で新しい行が作成されるのではなく、実際には 1 秒ごとに変更されることがわかりました。パイソンで。プログレスバーに必要な情報を取得できるように、これを回避する方法はあると思いますか?

4

1 に答える 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 を使用しないでください。

于 2014-06-05T20:50:45.387 に答える