在Python中覆盖Google Drive API v3 Argparse
我正在尝试将GoogleDrive API(v3)与Python结合使用,以获取文件并将其上载到我的GoogleDrive帐户 我使用本指南设置身份验证: 但对于我的程序,我希望为用户名、文件名和输出文件名获取命令行输入。我修改了google文档代码并执行了以下操作:在Python中覆盖Google Drive API v3 Argparse,python,google-drive-api,argparse,oauth2,Python,Google Drive Api,Argparse,Oauth2,我正在尝试将GoogleDrive API(v3)与Python结合使用,以获取文件并将其上载到我的GoogleDrive帐户 我使用本指南设置身份验证: 但对于我的程序,我希望为用户名、文件名和输出文件名获取命令行输入。我修改了google文档代码并执行了以下操作: from __future__ import print_function import httplib2 import os from sys import argv from apicli
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方法使用了google编写的另一个argparser(请参阅:)
因此,每当我用自己的用户名、文件名等输入运行这个脚本时,我总是会收到一个错误,上面写着“无法识别的参数”
如何使argparser重写run\u流中的argparser
编辑:
有人建议使用parse_known_args()
好的,我修改了我的代码来解析,说args,flags=parser.parse_known_args(),因为这样,任何其他的。输入将进入标志
这个想法是,如果我运行脚本并给它我的3个参数,它应该把它们拉到“参数”中
但问题是,稍后当我在get_凭据中调用run_flow方法时,它会抛出一个错误,说:
用法:name.py[--auth\u host\u name auth\u host\u name]
[--noauth_local_webserver]
[--auth_host_port[auth_host_port…]]
[--logging_level{DEBUG,INFO,WARNING,ERROR,CRITICAL}]无法识别的参数:-u shishy-f fname-d random_name
我认为它仍在将我的命令行输入传递给get_info方法,而解析器不知道该如何处理它…我认为还有其他关于
argparse
和google api
的问题,但我没有使用后者
解析器是独立的,不能重写。但它们都(默认情况下)使用sys.argv[1:://code>。因此,如果您的代码先于另一个运行,则可以编辑sys.argv
以删除额外的字符串。使用parse_known_args
是一种将您的参数与其他解析器应该使用的参数分开的简便方法
通常从if\uuu name\uu
块调用解析器。这样导入的模块就不会进行解析,只会将它们用作脚本。但是我不知道谷歌api是否有这样的区别。没关系,我知道了。hpaulj说得对
在get_credentials()方法中,在调用run_flow()之前,我只需添加一行代码:
flags=tools.argparser.parse_args(args=[])
credentials=tools.run_flow(flow, store, flags)
在开始的时候,当我用输入读取命令行时,我只是使用了hpaulj建议的parser_known_flags()
谢谢,
shishy他们的goad中的if__name__块只是初始化main()。argparse部分仅位于函数外部的开始部分。我实际上在考虑这篇文章,以及我可能如何做类似的事情:只是新版本中没有samples_tools.init()。parse_known_args的问题是get_info方法导致了这个错误,这是google方法的一部分。如果我将信息传递到命令行,它会解析这些信息,并试图说“哦,哇,这些不是我所期望的”,这对我来说非常有效。感谢分享您的解决方案