Перезапись 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, и парсер там не знает, что с ним делать ...