Sobrescribiendo el API de Google Drive v3 Argparse en Python

Estoy tratando de usar la API de Google Drive (v3) con Python para obtener y cargar archivos en mi cuenta de Google Drive.

Utilicé esta guía para configurar mi autenticación: https://developers.google.com/drive/v3/web/quickstart/python

Pero para mi progtwig, me gustaría tomar la entrada de línea de comandos para el nombre de usuario, nombre de archivo y nombre de archivo de salida. Modifiqué el código de Google Doc e hice lo siguiente:

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 

El problema es que en el método get_credentials, hay una línea que dice:

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

El método run_flow utiliza un argparser diferente que escribió google (consulte: http://oauth2client.readthedocs.io/en/latest/source/oauth2client.tools.html )

Entonces, cada vez que ejecuto este script con mis propias entradas con nombre de usuario, nombre de archivo, etc., recibo un error que dice “Argumentos no reconocidos”.

¿Cómo hago que mi argparser sobrescriba el de run_flow?

EDITAR:

Alguien sugirió usar parse_known_args ().

Bueno, modifiqué mi código para analizar diciendo args, flags = parser.parse_known_args () porque de esa manera, cualquier misc. Las entradas entrarían en las banderas.

La idea es que si ejecuto el script y le doy mis 3 argumentos, debería ponerlos en “argumentos”.

Pero el problema con esto de nuevo es que más adelante, cuando llamo al método run_flow en get_credentials, produce un error que dice:

Usage: name.py [–auth_host_name AUTH_HOST_NAME] [–noauth_local_webserver] [–auth_host_port [AUTH_HOST_PORT …]]] [–logging_level {DEBUG, INFO, WARNING, ERROR, CRITICAL}] No hay comentarios. -f fname -d random_name

Creo que todavía está pasando mi entrada de línea de comando al método get_info y el analizador no tiene idea de qué hacer con él …

Creo que ha habido otras preguntas sobre argparse y la google api , pero no he usado esta última.

Los analizadores son independientes y no pueden ser sobreescritos. Pero todos ellos (por defecto de todos modos) usan sys.argv[1:] . Así que si su código se ejecuta antes que el otro, puede editar sys.argv para eliminar las cadenas adicionales. Usar parse_known_args es una manera útil de separar sus argumentos de los que otros analizadores deben usar.

A menudo, el analizador se invoca desde un bloque if __name__ . De esa manera, los módulos importados no realizan el análisis, solo los que se usan como scripts. Pero no lo hago si el google api hace esta distinción.

No importa, lo descubrí. hpaulj tenía razón.

En el método get_credentials (), justo antes de que se llamara run_flow (), simplemente tenía que agregar una línea que decía:

 flags=tools.argparser.parse_args(args=[]) credentials=tools.run_flow(flow, store, flags) 

Y al principio, cuando leí la línea de comandos con mis entradas, simplemente usé parser_known_flags () como hpaulj sugirió.

Gracias shishy