Python多个任务/子流程

时间:2017-12-18 04:39:38

标签: python subprocess popen

目前,我正在努力了解如何将python脚本带到彼此执行多项任务。

对于这种情况,我将自己设定为目标:

创建一个带有URL的脚本,通过HTTP-GET传递,下载URL后面的视频,将其转换为mp3文件并执行一些"下载后的内容"比如设置mp3标签。 这里的挑战应该是,接受新的"下载请求" while 另一个下载/转换/后期下载过程已激活。

如果这种用法有意义,不应该是这个问题的重点(因为我知道已经有软件可用于实现视频到mp3的下载)。 我只是想了解如何在执行其他任务(下载/转换/后期下载)时使用python来提供某个服务(httpd)。

首先,我尝试尽可能基本。 所以我决定使用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,同时接受另一个下载请求,但我不知道在 >下载/转换之后对文件执行进一步操作< strong> while 接受并开始新的下载/转换。

使用subprocess.call()并等到youtube-dl完成后会破坏接受另一个下载的选项,与当前版本并行。

编写第二个脚本,我以.Popen()开头处理下载/转换/后期下载 - 这些似乎不是正确的方法^^

现在这对我来说是鸡蛋和鸡蛋的情况......希望你能开导我......

1 个答案:

答案 0 :(得分:0)

来自Sanket Sudake的小费为我做了诀窍!

我使用Celery作为具有已定义任务的任务管理器,我在异步链接的帮助下调用以在专门的任务中处理我定义的任务(下载和转换&amp; post_download-stuff)。

非常好用!

和Celery有更多功能和技术可供试验! 但对于我自定义的情况,任务的异步链工作正常,这是我的解决方案!

我添加了一个systemd-config,将其用作systemd可管理的守护程序服务。