Python 如何在上传到Google Drive后删除本地文件?

Python 如何在上传到Google Drive后删除本地文件?,python,Python,我需要一个python函数,它将文件上传到googledrive,然后从文件系统中删除它。尝试使用以下代码时,我在尝试删除文件时出错: def upload(): file_metadata = { 'name': 'thankyou.jpg', 'mimeType': 'image/jpeg'} media = MediaFileUpload('thankyou.jpg') myfile = drive_service.files().c

我需要一个python函数,它将文件上传到googledrive,然后从文件系统中删除它。尝试使用以下代码时,我在尝试删除文件时出错:

def upload():
    file_metadata = {
        'name': 'thankyou.jpg',
        'mimeType': 'image/jpeg'}
    media = MediaFileUpload('thankyou.jpg')
    myfile = drive_service.files().create(body=file_metadata, media_body=media, fields='id').execute()
    os.remove('thankyou.jpg')
上载成功完成,但上载后我无法在本地删除该文件。 我得到的错误是:

PermissionError: [WinError 32] The process cannot access the file 
because it is being used by another process: 'thankyou.jpg'

要删除文件,我应该怎么做?

我在我的一个项目中尝试过,你可以添加任何东西的返回函数(我只使用了文件id),然后在使用
upload()
之后,只需执行
os.remove('somethingidk.jpg')

例如:

之前: main.py

                try:
                    SendFile('output.avi', 'output.avi', 'video/avi')
                except:
                    SendFile('output.avi', 'output.avi', 'video/avi')
                try:
                    SendFile('output.avi', 'output.avi', 'video/avi')
                except:
                    SendFile('output.avi', 'output.avi', 'video/avi')

                os.remove('output.avi')

file-uploader.py

def SendFile(file_path, file_name, mime):
    folder_id = ''
    file_metadata = {
    'name': file_name,
    'parents': [folder_id]}
    media = MediaFileUpload(file_path,
                        mimetype=mime)
    file = service.files().create(body=file_metadata,
                                    media_body=media,
                                    fields='id').execute()
    print("File ID: %s" % file.get('id'))
    os.remove('output.avi')
def SendFile(file_path, file_name, mime):
    folder_id = ''
    file_metadata = {
    'name': file_name,
    'parents': [folder_id]}
    media = MediaFileUpload(file_path,
                        mimetype=mime)
    file = service.files().create(body=file_metadata,
                                    media_body=media,
                                    fields='id').execute()
    print("File ID: %s" % file.get('id'))
    return file.get('id')
之后: main.py

                try:
                    SendFile('output.avi', 'output.avi', 'video/avi')
                except:
                    SendFile('output.avi', 'output.avi', 'video/avi')
                try:
                    SendFile('output.avi', 'output.avi', 'video/avi')
                except:
                    SendFile('output.avi', 'output.avi', 'video/avi')

                os.remove('output.avi')

file-uploader.py

def SendFile(file_path, file_name, mime):
    folder_id = ''
    file_metadata = {
    'name': file_name,
    'parents': [folder_id]}
    media = MediaFileUpload(file_path,
                        mimetype=mime)
    file = service.files().create(body=file_metadata,
                                    media_body=media,
                                    fields='id').execute()
    print("File ID: %s" % file.get('id'))
    os.remove('output.avi')
def SendFile(file_path, file_name, mime):
    folder_id = ''
    file_metadata = {
    'name': file_name,
    'parents': [folder_id]}
    media = MediaFileUpload(file_path,
                        mimetype=mime)
    file = service.files().create(body=file_metadata,
                                    media_body=media,
                                    fields='id').execute()
    print("File ID: %s" % file.get('id'))
    return file.get('id')
编辑 或 只要这样做:
这只是在函数内部使用函数。然后在上载时使用
SendFile

我自己在Windows 10中遇到了这个问题,最后想出了这个解决方案:将用于存储MediaFileUpload对象的变量设置为无:

    media = MediaFileUpload(folder+file.name, resumable=True)
logging.info("{} - {} {}MB uploading...".format(datetime.datetime.now().strftime("%H:%M:%S"), file.name, file_size))
try:
    service.files().create(body=file_metadata, media_body=media, fields='id').execute()
    logging.info(datetime.datetime.now().strftime("%H:%M:%S")+" - "+file.name+" uploaded")
    media = None
except Exception as err:
    logging.warning(datetime.datetime.now().strftime("%H:%M:%S")+" - "+file.name+" failed to upload:\nType: {}".format(type(err)))

try:
    os.remove(folder+file.name)
    logging.info(datetime.datetime.now().strftime("%H:%M:%S")+" - "+file.name+" deleted.")
except PermissionError as err:
    logging.error("{} - Failed to delete local file. Looks like a permision error: {}".format(datetime.datetime.now().strftime("%H:%M:%S"), err))
except Exception as err:
    logging.warning("{} - Failed to delete local file: {}".format(datetime.datetime.now().strftime("%H:%M:%S"), err))

正如错误所说,该文件仍在使用中。google drive SDK是否异步上传文件,因此,您试图在文件仍在上传时删除它?@user8181134据我所知,它是同步上传的,因为为了使其异步,我必须添加元数据“resumable=true”。因为我在Google Drive中看到上传已经完成,我认为情况并非如此。你有什么建议我可以验证它吗?我没有谷歌硬盘SDK的经验,所以我不能回答任何具体的问题。也许它仍然在另一个程序中打开,比如Windows photo app?@user8181134我很确定它与作为Google Drive SDK一部分的MediaFileUpload对象特别相关。该文件在其他任何地方都不会打开(尝试了几个不同的文件),当Python程序终止时,我可以手动删除它,如果涉及其他程序,这是不可能的。我很想使用它,只是调用函数是一个外部服务-上传函数是Flask基础设施的一部分,因此,它是在收到对某个url的POST请求时运行的。因此,我不能让调用函数删除该文件,因为它不在同一台服务器上运行。还有其他想法吗?嗨。如果答案解决了您的问题,您可以按下复选标记,表示此问题已解决。谢谢