瞬間、私はお互いに沿って複数のタスクを実行するのpythonスクリプトをもたらすかを理解するために苦労しています。Pythonの複数のタスク/サブプロセス
から渡されたURLを取ったスクリプトを作るHTTP-GET、URLの後ろにビデオをダウンロードし、mp3ファイルに変換して実行します。このケースでは
は、私は私の自己目標を設定しましたmp3タグの設定のようないくつかの「ダウンロード後のもの」。 別のダウンロード/変換/ポストダウンロードプロセスがアクティブなのに対し、ここでの挑戦は新しい "ダウンロード要求"を受け入れるためにであるべきです。
この用法は理にかなっているか、いない場合は(私は、ビデオ・ツー・mp3・ダウンロードを達成することが可能なソフトウェアがすでに存在している知っているので)、この質問のポイントではありません。 私は、他のタスク(ダウンロード/変換/ポストダウンロード)を実行中に特定のサービス(httpd)を提供するためにPythonをどのように使用するかを理解しようとしています。
開始のために、私は可能な限り、基本的なことを試みました。 だから私はBaseHttpServerとyoutube-dlを使うことにしました。 BaseHttpServerは私のスクリプトの中でHTTPを扱い、扱うことができ、youtube-dlはダウンロード/変換を管理します。ダウンロード後の処理は私の問題です。
私は複数の「ダウンロード要求」を受け入れ、複数の子プロセスを開始することができますが、ダウンロード後に「ダウンロード後」のもの(mp3タグの設定など)を開始するにはどうしたらいいですか? /変換が完了しました。私は特定のファイルのダウンロード/変換が正常に終了したという情報にどのように手がかりを得ているのか分かりません。ここで
は、これまで#!/usr/bin/env python
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import SocketServer
import subprocess
class S(BaseHTTPRequestHandler):
def _set_headers(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
def do_GET(self):
# set youtube-dl command and arguments
args = ['youtube-dl', '--extract-audio', '--audio-format', 'mp3', '--output', '%(title)s.%(ext)s', '--no-playlist', '--quiet']
# building HTTP Header and extract path from it
self._set_headers()
passed = self.path # catch the passed url
url = passed[1:] # cutoff leading/
if url:
# append the url as the last argument to args
args.append(url)
# download
subprocess.Popen(args)
else:
print('empty request')
def run(server_class=HTTPServer, handler_class=S, port=8000):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print 'Starting httpd...'
httpd.serve_forever()
if __name__ == "__main__":
from sys import argv
if len(argv) == 2:
run(port=int(argv[1]))
else:
run()
これは動画をダウンロードし、別のダウンロード要求を受け入れながら、mp3としてそれを格納するために私を可能に私のコードですが、私は、ファイルにさらに操作を実行するのか分かりませんの後にダウンロード/変換されました新しいダウンロード/変換を受け入れて開始します。
subprocess.call()
を使用し、ユーチューブ-DLは、別のダウンロードを受け入れ、現在に平行するオプションを破る完了するまで待ちます。
と一緒に、私はダウンロードを処理するために.Popen()
で始まる2番目のスクリプト/変換/ポストダウンロード-ものを書くことは今のところ、これがために鶏と卵の状況で正しい方法^^
ではないようです私は... Sanket Sudakeから
HTTPタイムアウトを簡単に突き止めることができる十分な処理を行っています。 [celery](http://www.celeryproject.org/)のようなタスクマネージャを使用してこのワークフローを処理することをお勧めします。セロリでワークフローをはるかに良く扱うことができ、複数のプロセスを管理する必要はありません。 –
答えに感謝します...私はそれを認識していませんでした。私は間違いなくこれは本当に良いと固体のように見えるセロリを見ている! - しかし私はまだ他のコメントやアイデアのために開いています! – rohr