Перезапись Google Drive API v3 Argparse в Python

Я пытаюсь использовать Google Drive API (v3) с Python для получения и загрузки файлов в мою учетную запись Google Drive.

Я использовал это руководство для настройки моей аутентификации:https://developers.google.com/drive/v3/web/quickstart/python

Но для моей программы я хотел бы взять данные командной строки для имени пользователя, имени файла и имени_файла вывода. Я изменил код Google Doc и сделал следующее:

  from __future__ import print_function
    import httplib2
    import os
    from sys import argv 
    from apiclient import discovery
    from oauth2client import client
    from oauth2client import tools
    from oauth2client.file import Storage
    from apiclient.http import MediaIoBaseDownload, MediaIoBaseUpload 
    import io  

    try:
        import argparse
        parser = argparse.ArgumentParser(description="I want your name, the file ID, and the folder you want to dump output to")
        parser.add_argument('-u', '--username', help='User Name', required=True)
        parser.add_argument('-f', '--filename', help='File Name', required=True)
        parser.add_argument('-d', '--dirname', help = 'Directory Name', required=True)
        flags = parser.parse_args()

    except ImportError:
        flags = None

    SCOPES = 'https://www.googleapis.com/auth/drive'
    CLIENT_SECRET_FILE = 'client_secret.json'
    APPLICATION_NAME = 'Drive API Python Quickstart'
    ...#rest of the code is from the Google Drive Documentation (see above)

def get_credentials():
    """Gets valid user credentials from storage.

    If nothing has been stored, or if the stored credentials are invalid,
    the OAuth2 flow is completed to obtain the new credentials.

    Returns:
        Credentials, the obtained credential.
    """

    home_dir = os.path.expanduser('~')

    credential_dir = os.path.join(home_dir, '.credentials')
    if not os.path.exists(credential_dir):
        os.makedirs(credential_dir)
    credential_path = os.path.join(credential_dir,
                                   'drive-python-quickstart.json')

    store = Storage(credential_path)
    credentials = store.get()
    #Credentials returns NONE
    if not credentials or credentials.invalid:
        flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
        flow.user_agent = APPLICATION_NAME
        if args:
          credentials = tools.run_flow(flow, store)
        else: # Needed only for compatibility with Python 2.6
            credentials = tools.run(flow, store)
        print('Storing credentials to ' + credential_path)

    print("check")
    return credentials

Проблема в том, что в методе get_credentials есть строка, которая говорит:

if flags:
  credentials = tools.run_flow(flow, store, flags)
else: # Needed only for compatibility with Python 2.6
  credentials = tools.run(flow, store)

Метод run_flow использует другой argparser, который написал Google (см .:http://oauth2client.readthedocs.io/en/latest/source/oauth2client.tools.html)

Поэтому всякий раз, когда я запускаю этот сценарий со своими собственными входными данными с именем пользователя, именем файла и т. Д., Я получаю сообщение об ошибке «Нераспознанные аргументы».

Как мне сделать так, чтобы мой argparser переписал тот, что в run_flow?

РЕДАКТИРОВАТЬ:

Кто-то предложил использовать parse_known_args ().

Ну, я изменил свой код для анализа, сказав args, flags = parser.parse_known_args (), потому что таким образом, любая ошибка. входы будут идти во флаги.

Идея состоит в том, что если я запустлю скрипт и передам ему 3 аргумента, он должен превратить их в «аргументы».

Но проблема с этим снова заключается в том, что позже, когда я вызываю метод run_flow в get_credentials, он выдает ошибку, говорящую:

Использование: name.py [--auth_host_name AUTH_HOST_NAME] [--noauth_local_webserver] [--auth_host_port [AUTH_HOST_PORT ...]]] [--logging_level {DEBUG, INFO, WARNING, ERROR, CRITICAL}] Нераспознанные аргументы: -u shishy -f имя -d случайное_имя

Я думаю, что он все еще передает мой ввод командной строки в метод get_info, и парсер там не знает, что с ним делать ...

Ответы на вопрос(1)

Ваш ответ на вопрос