Python 您可以同时下载多个文件

Python 您可以同时下载多个文件,python,python-3.x,youtube-dl,Python,Python 3.x,Youtube Dl,我有一个python应用程序,其中有一个包含多个URL的变量 现在我用的是这样的东西: for v in arr: cmd = 'youtube-dl -u ' + email + ' -p ' + password + ' -o "' + v['path'] + '" ' + v['url'] os.system(cmd) 但这样我只下载了一个又一个视频。我怎样才能同时下载3个视频呢?(不是来自youtube,因此没有播放列表或频道) 我不需要python中

我有一个python应用程序,其中有一个包含多个URL的变量

现在我用的是这样的东西:

for v in arr:
        cmd = 'youtube-dl -u ' + email + ' -p ' + password + ' -o "' + v['path'] + '" ' + v['url']

        os.system(cmd)
但这样我只下载了一个又一个视频。我怎样才能同时下载3个视频呢?(不是来自youtube,因此没有播放列表或频道)

我不需要python中的多线程,但需要多次调用youtube dl,拆分数组。因此,从python的角度来看,可以在线程上运行。

使用:

是一个轻量级的基于线程的
池版本,在这里更合适,因为工作任务只是启动子流程

请注意,不要使用
os.system
,这会防止在以前的代码中出现错误

还要注意的是,youtube dl非常强大。在大多数情况下,您实际上不需要自己定义和管理文件名。

使用:

是一个轻量级的基于线程的
池版本,在这里更合适,因为工作任务只是启动子流程

请注意,不要使用
os.system
,这会防止在以前的代码中出现错误


还要注意的是,youtube dl非常强大。在大多数情况下,您实际上不需要自己定义和管理文件名。

我使用
线程
库实现了同样的功能,这被认为是产生新进程的一种更轻松的方法

假设:
  • 每个任务都会将视频下载到不同的目录
导入操作系统
导入线程
导入youtube\u dl
COOKIE\u JAR=“路径\u到我的\u COOKIE\u JAR”
def下载任务(视频、输出目录):
如果不是os.path.isdir(输出目录):
os.makedirs(输出目录)
如果不是os.path.isfile(COOKIE\u JAR):
raise FileNotFoundError(“未找到Cookie Jar\n”)
ydl_opts={
“cookiefile”:COOKIE\u JAR,
'outtmpl':f'{output_dir}/%(title)s.%(ext)s'
}
使用youtube_dl.YoutubeDL(ydl_选项)作为ydl:
下载(视频)
如果名称=“\uuuuu main\uuuuuuuu”:
output_dir=“./root_dir”
线程=[]
对于多个播放列表中的播放列表:
output_dir=f“{output_dir}/playlist.name”
线程=线程。线程(目标=下载任务,参数=(播放列表,输出目录))
附加(线程)
#开始下载
对于线程中的线程:
thread.start()
#等待所有下载完成
对于线程中的线程:
thread.join()

我使用
线程化
库实现了同样的效果,这被认为是产生新进程的一种更轻松的方式

假设:
  • 每个任务都会将视频下载到不同的目录
导入操作系统
导入线程
导入youtube\u dl
COOKIE\u JAR=“路径\u到我的\u COOKIE\u JAR”
def下载任务(视频、输出目录):
如果不是os.path.isdir(输出目录):
os.makedirs(输出目录)
如果不是os.path.isfile(COOKIE\u JAR):
raise FileNotFoundError(“未找到Cookie Jar\n”)
ydl_opts={
“cookiefile”:COOKIE\u JAR,
'outtmpl':f'{output_dir}/%(title)s.%(ext)s'
}
使用youtube_dl.YoutubeDL(ydl_选项)作为ydl:
下载(视频)
如果名称=“\uuuuu main\uuuuuuuu”:
output_dir=“./root_dir”
线程=[]
对于多个播放列表中的播放列表:
output_dir=f“{output_dir}/playlist.name”
线程=线程。线程(目标=下载任务,参数=(播放列表,输出目录))
附加(线程)
#开始下载
对于线程中的线程:
thread.start()
#等待所有下载完成
对于线程中的线程:
thread.join()
import multiprocessing.dummy
import subprocess

arr = [
    {'vpath': 'example/%(title)s.%(ext)s', 'url': 'https://www.youtube.com/watch?v=BaW_jenozKc'},
    {'vpath': 'example/%(title)s.%(ext)s', 'url': 'http://vimeo.com/56015672'},
    {'vpath': '%(playlist_title)s/%(title)s-%(id)s.%(ext)s',
     'url': 'https://www.youtube.com/playlist?list=PLLe-WjSmNEm-UnVV8e4qI9xQyI0906hNp'},
]

email = 'my-email@example.com'
password = '123456'

def download(v):
    subprocess.check_call([
        'echo', 'youtube-dl',
        '-u', email, '-p', password,
        '-o', v['vpath'], '--', v['url']])


p = multiprocessing.dummy.Pool(concurrent)
p.map(download, arr)