Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中覆盖Google Drive API v3 Argparse_Python_Google Drive Api_Argparse_Oauth2 - Fatal编程技术网

在Python中覆盖Google Drive API v3 Argparse

在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

我正在尝试将GoogleDrive API(v3)与Python结合使用,以获取文件并将其上载到我的GoogleDrive帐户

我使用本指南设置身份验证:

但对于我的程序,我希望为用户名、文件名和输出文件名获取命令行输入。我修改了google文档代码并执行了以下操作:

  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方法的一部分。如果我将信息传递到命令行,它会解析这些信息,并试图说“哦,哇,这些不是我所期望的”,这对我来说非常有效。感谢分享您的解决方案