【问题标题】:Python MemoryError when uploading big video through YouTube Data API通过 YouTube 数据 API 上传大视频时出现 Python MemoryError
【发布时间】:2021-04-26 05:55:58
【问题描述】:

在尝试将大型视频文件上传到 YouTube 时获取 MemoryError。上传较小的文件时可以,但是当文件较大时,我会得到MemoryError。我猜这是因为代码试图将视频文件加载到 RAM。有什么方法可以上传视频而不将其加载到 RAM 中。

import os
from googleapiclient.http import MediaFileUpload
import google_auth_oauthlib.flow
import googleapiclient.discovery
import googleapiclient.errors

scopes = ["https://www.googleapis.com/auth/youtube.upload"]


def main():
    os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "0"

    client_secret_file = 'client_credentials.json'
    api_name = 'youtube'
    api_version = 'v3'

    flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file(client_secret_file, scopes)
    credentials = flow.run_console()
    youtube = googleapiclient.discovery.build(api_name, api_version, credentials=credentials)

    request = youtube.videos().insert(
        part='snippet,status',
        body={
            'snippet': {
                'categoryId': "20",
                'title': 'test title',
                'tags': ['tag1', 'tag2']
            },
            'status': {
                'privacyStatus': 'private'
            }
        },
        media_body=MediaFileUpload(File Path)
    )

    response = request.execute()

    print(response)


if __name__ == '__main__':
    main()

【问题讨论】:

  • 这是我在 stackoverflow 中的第一个问题。谢谢你的回答。我已经从官方 YouTube 脚本中复制了代码,但做了一点改动,当然我不知道如何使用“已解析”、“参数”。它实际上解决了内存错误问题。
  • 如果 argparse 模块的功能有问题,那么您很可能会打开一个附加标签的新问题:argparsepython

标签: python youtube-data-api


【解决方案1】:

您的MemoryError 异常的原因如下:您的输入视频文件gets loaded in memory 在被处理以发送到远程服务之前完整:

def createMethod(methodName, methodDesc, rootDesc, schema):
    ...
    def method(self, **kwargs):
        ...
        if media_filename:
            ...
            if media_upload.resumable():
                ...
            else:
                # A non-resumable upload
                if body is None:
                    ...
                else:
                    ...
                    payload = media_upload.getbytes(0, media_upload.size())
                    ...

我强烈建议不要一次性上传视频,而是通过久经考验的公共 Google 脚本 upload_video.py 使用 resumable uploads。 (这个脚本也有一个official documentation。要从脚本中获得一个不言自明的使用信息页面,只需使用命令行选项--help 发出它。)


如果您使用的是 Python 3(您的代码建议这样做),那么您必须将该脚本转换为 Python 3,因为它是为 Python 2 编写的。为此,请参阅修补upload_video.pyone answer of mine

【讨论】:

  • 您好像忘记在文档字符串中添加右引号
  • 不,没有忘记,只是上面的代码摘录旨在指示上下文(有几个省略号会截断显示的代码)。我删除了该行以减轻混乱。
猜你喜欢
  • 2011-05-28
  • 1970-01-01
  • 2014-09-27
  • 2012-08-19
  • 2014-09-04
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 2020-06-29
相关资源
最近更新 更多