toMedia
快速开始

CLI 与 Python 对比

命令行可执行文件与 Python API 的区别、优劣和适用场景

yt-dlp 提供两种使用方式,本页帮助你理解它们的差异,选择最适合的方式。

对照表

特性CLI(命令行)Python API
上手难度⭐ 简单⭐⭐ 中等
灵活性中等
批量自动化Shell 脚本原生支持
错误处理退出码try/except
回调/钩子不支持支持
进度监控终端输出回调函数
集成到其他程序子进程调用直接导入
适用场景手动下载、快速使用程序集成、自动化工作流

同一功能的对比

基础下载

yt-dlp -f "bestvideo+bestaudio" -o "%(title)s.%(ext)s" "URL"
import yt_dlp

ydl_opts = {
    'format': 'bestvideo+bestaudio',
    'outtmpl': '%(title)s.%(ext)s',
}

with yt_dlp.YoutubeDL(ydl_opts) as ydl:
    ydl.download(["URL"])

提取音频

yt-dlp -x --audio-format m4a --audio-quality 0 \
  --embed-thumbnail --add-metadata "URL"
import yt_dlp

ydl_opts = {
    'format': 'bestaudio/best',
    'writethumbnail': True,
    'postprocessors': [
        {
            'key': 'FFmpegExtractAudio',
            'preferredcodec': 'm4a',
            'preferredquality': '0',
        },
        {'key': 'EmbedThumbnail'},
        {'key': 'FFmpegMetadata'},
    ],
}

with yt_dlp.YoutubeDL(ydl_opts) as ydl:
    ydl.download(["URL"])

CLI 选项到 Python 映射规则

大部分 CLI 选项可以直接映射到 Python 的 ydl_opts 字典:

CLI 选项Python 参数说明
-f FORMAT'format': 'FORMAT'格式选择
-o TEMPLATE'outtmpl': 'TEMPLATE'输出模板
-xpostprocessors 中添加 FFmpegExtractAudio提取音频
--audio-format m4a'preferredcodec': 'm4a'音频格式
--audio-quality 0'preferredquality': '0'音频质量
--embed-thumbnail'writethumbnail': True + EmbedThumbnail PP嵌入封面
--add-metadataFFmpegMetadata PP写入元数据
--proxy URL'proxy': 'URL'代理设置
--cookies FILE'cookiefile': 'FILE'Cookies 文件
--write-sub'writesubtitles': True下载字幕
--no-overwrites'overwrites': False不覆盖文件

完整映射参考:CLI 的 --help 中每个选项对应的 Python key 可在 yt-dlp 源码 options.py 中找到 dest= 参数名。

Python 独有能力

进度回调

import yt_dlp

def progress_hook(d):
    if d['status'] == 'downloading':
        percent = d.get('_percent_str', 'N/A')
        speed = d.get('_speed_str', 'N/A')
        print(f"\r下载中: {percent} | 速度: {speed}", end='')
    elif d['status'] == 'finished':
        print(f"\n下载完成: {d['filename']}")

ydl_opts = {
    'progress_hooks': [progress_hook],
}

with yt_dlp.YoutubeDL(ydl_opts) as ydl:
    ydl.download(["URL"])

信息提取(不下载)

import yt_dlp

with yt_dlp.YoutubeDL({'skip_download': True}) as ydl:
    info = ydl.extract_info("URL", download=False)

    print(f"标题: {info['title']}")
    print(f"时长: {info['duration']}s")
    print(f"可用格式数: {len(info.get('formats', []))}")

    for f in info.get('formats', []):
        print(f"  {f['format_id']}: {f.get('ext')} "
              f"{f.get('resolution', 'audio')} "
              f"{f.get('filesize_approx', 0) / 1024 / 1024:.1f}MB")

错误处理

import yt_dlp

ydl_opts = {'format': 'bestaudio/best'}

try:
    with yt_dlp.YoutubeDL(ydl_opts) as ydl:
        ydl.download(["URL"])
except yt_dlp.utils.DownloadError as e:
    print(f"下载失败: {e}")
except yt_dlp.utils.ExtractorError as e:
    print(f"解析失败: {e}")
except Exception as e:
    print(f"未知错误: {e}")

如何选择?

  • 一次性下载 → 用 CLI,快速方便
  • 写脚本批量处理 → 用 Python,更灵活
  • 集成到现有项目 → 用 Python,直接 import
  • 需要进度回调 → 用 Python,支持 hooks
  • 快速测试参数 → 用 CLI,验证后再写 Python 代码

On this page