使用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
相关产品推荐
相关产品推荐

