Substituindo Argparse da API do Google Drive v3 em Python

Estou tentando usar a API do Google Drive (v3) com Python para obter e fazer upload de arquivos para minha conta do Google Drive.

Eu usei este guia para configurar minha autenticação:https://developers.google.com/drive/v3/web/quickstart/python

Mas, para o meu programa, eu gostaria de receber a entrada da linha de comando para nome de usuário, nome do arquivo e output_filename. Modifiquei o código do Google Doc e fiz o seguinte:

  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

O problema é que, no método get_credentials, existe uma linha que diz:

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

O método run_flow usa um argparser diferente que o google escreveu (consulte:http://oauth2client.readthedocs.io/en/latest/source/oauth2client.tools.html)

Portanto, sempre que executo esse script com minhas próprias entradas, com nome de usuário, nome de arquivo etc., continuo recebendo um erro que diz "Argumentos não reconhecidos".

Como faço para o meu argparser sobrescrever o do run_flow?

EDITAR:

Alguém sugeriu o uso de parse_known_args ().

Bem, eu modifiquei meu código para analisar dizendo args, flags = parser.parse_known_args () porque dessa forma, qualquer misc. entradas entrariam em sinalizadores.

A idéia é que, se eu rodar o script e der meus 3 args, ele deve ser colocado em "args".

Mas o problema com isso novamente é que, mais tarde, quando eu chamo o método run_flow em get_credentials, gera um erro dizendo:

Uso: name.py [--auth_host_name AUTH_HOST_NAME] [--noauth_local_webserver] [--auth_host_port [AUTH_HOST_PORT ...]]] [--logging_level {DEBUG, INFO, WARNING, ERROR, CRITICAL}] Argumentos não reconhecidos: -u shishy -f fname -d nome_ aleatório

Eu acho que ainda está passando minha entrada da linha de comando para o método get_info e o analisador não tem idéia do que fazer com ele ...

questionAnswers(2)

yourAnswerToTheQuestion