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 ...