지금은 파이썬 스크립트를 가져 와서 여러 태스크를 수행하는 방법을 이해하는 데 어려움을 겪고 있습니다.파이썬 다중 태스크/서브 프로세스
에 의해 전달 된 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()
을 사용하고 youtube-dl이 끝날 때까지 기다리면 현재 다운로드와 다른 방식으로 다운로드 할 수 있습니다.
내가 함께/후 다운로드-일을 변환/다운로드를 처리 할 수 .Popen()
로 시작하는 두 번째 스크립트를 작성하는 것은 올바른 방법 ^^ 될 것 같지 않습니다
지금이는 닭고기와 계란 상황입니다 나 ... 당신이 나를 계몽 할 수 있기를 희망한다. ...
HTTP 시간 초과를 쉽게 맞출 수있는 충분한 처리를하고 있습니다. [셀러리] (http://www.celeryproject.org/)와 같은 일부 작업 관리자를 사용하여이 워크 플로를 처리하는 것이 좋습니다. 셀러리를 사용하면 워크 플로우를 훨씬 잘 처리 할 수 있으며 여러 프로세스를 보유하거나 관리 할 필요가 없습니다. –
답변을 주셔서 감사합니다 ... 나는 그 사실을 몰랐습니다. 나는 이것이 정말로 좋고 견고한 것처럼 보이기 때문에 셀러리를 보게 될 것입니다! - 그러나 나는 아직도 다른 의견과 아이디어를 위해 열려 있습니다! – rohr