You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Facebook Graph API传视频后删文件遇PermissionError求助

问题:Facebook API上传视频后无法删除本地文件(提示被进程占用)

通过Facebook Graph API实现视频上传功能,上传可正常完成,但执行os.remove()删除本地视频文件时触发PermissionError: [WinError 32]错误,提示文件被其他进程占用。已在上传后调用files['source'].close()关闭文件句柄,但问题仍未解决。

相关代码

import requests
import pandas as pd
import os

videoTitle = 'Title of the post'
videoDesc = 'some xyz desc'
excel_path = fr'Output/Social/Facebook API.xlsx'
df = pd.read_excel(excel_path)
pageID = df['PageID'].tolist()[0]
access_token = df['Access Token'].tolist()[0]
url = f'https://graph-video.facebook.com/v17.0/{pageID}/videos'

try:
    vidFile = r"Output/ImagestoVideo/1616 Mackinac Dr. Crowley.mp4"
    files = {'source': open(vidFile, 'rb')}
    payload = {
        'access_token': access_token,
        'title': videoTitle,
        'description': videoDesc,
    }
    response = requests.post(url, files=files, data=payload, verify=False).json()
    files['source'].close()
    video_id = response['id']
    if video_id:
        print(f'https://www.facebook.com/{pageID}/videos/{video_id}')
except:
    pass

os.remove(r"Output/ImagestoVideo/1616 Mackinac Dr. Crowley.mp4")

报错信息

Traceback (most recent call last):
  File "D:\My Work\Drake YT Shorts\test3.py", line 92, in <module>
    os.remove(r"Output/ImagestoVideo/1616 Mackinac Dr. Crowley.mp4")
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'Output/ImagestoVideo/1616 Mackinac Dr. Crowley.mp4'

解决方案

问题根源是requests库在处理文件上传时,可能因内部缓存或资源未完全释放,导致手动调用close()后文件仍被占用。用**上下文管理器(with语句)**打开文件是最可靠的方式,它会自动在代码块结束后关闭并释放文件资源。

修改后的核心代码片段:

try:
    vidFile = r'Output/ImagestoVideo/1616 Mackinac Dr. Crowley.mp4'
    # 使用with语句自动管理文件生命周期
    with open(vidFile, 'rb') as video_file:
        files = {'source': video_file}
        payload = {
            'access_token': access_token,
            'title': videoTitle,
            'description': videoDesc,
        }
        response = requests.post(url, files=files, data=payload, verify=False).json()
    
    video_id = response['id']
    if video_id:
        print(f'https://www.facebook.com/{pageID}/videos/{video_id}')
except Exception as e:
    # 替换空except,捕获并打印异常方便排查
    print(f'上传失败: {str(e)}')

os.remove(vidFile)

额外提示

  • 避免使用空的except:,它会隐藏所有异常(包括上传失败、文件不存在等),不利于问题排查。
  • 上下文管理器会确保无论代码块是否正常执行,文件都会被正确关闭,彻底解决资源占用问题。

内容的提问来源于stack exchange,提问作者Naveen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:20:36