Google Drive API v3 Argparse in Python überschreiben

Ich versuche, die Google Drive-API (v3) mit Python zu verwenden, um Dateien abzurufen und auf mein Google Drive-Konto hochzuladen.

Ich habe diese Anleitung verwendet, um meine Authentifizierung einzurichten:https: //developers.google.com/drive/v3/web/quickstart/pytho

Aber für mein Programm möchte ich die Befehlszeileneingabe für Benutzername, Dateiname und Ausgabedateiname übernehmen. Ich habe den Google Doc-Code geändert und Folgendes getan:

  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

Das Problem ist, dass in der Methode get_credentials eine Zeile mit folgendem Wortlaut vorhanden ist:

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

Die run_flow-Methode verwendet jedoch einen anderen Argparser, den Google geschrieben hat (siehe:http: //oauth2client.readthedocs.io/en/latest/source/oauth2client.tools.htm)

Wenn ich dieses Skript mit meinen eigenen Eingaben mit Benutzername, Dateiname usw. ausführe, erhalte ich immer wieder die Fehlermeldung "Nicht erkannte Argumente".

Wie bringe ich meinen Argparser dazu, den in run_flow zu überschreiben?

BEARBEITEN

Jemand schlug vor, parse_known_args () zu verwenden.

Nun, ich habe meinen Code so geändert, dass er mit args, flags = parser.parse_known_args () analysiert wird. Eingaben würden in Flags gehen.

Die Idee ist, dass, wenn ich das Skript ausführe und ihm meine 3 Argumente gebe, es sie in "Argumente" ziehen sollte.

Aber das Problem dabei ist, dass später, wenn ich die run_flow-Methode in get_credentials aufrufe, ein Fehler ausgegeben wird, der besagt:

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}] Nicht erkannte Argumente shishy -f fname -d random_name

Ich denke, es wird immer noch meine Kommandozeilen-Eingabe an die get_info-Methode übergeben und der Parser hat keine Ahnung, was er damit machen soll ...

Antworten auf die Frage(4)

Ihre Antwort auf die Frage