导入的python模块覆盖选项解析器

Sha*_*arA 5 python optparse argparse google-oauth

我编写了一个python实用程序脚本,它使用optparse在脚本启动时包含选项和标志.

一切都很好,但是当我导入谷歌API oauth2client并运行它的执行功能时,它会覆盖我add_options使用的选项.

当我说'覆盖'时,我的意思是即使我的脚本向我的选项解析器添加选项,当我执行脚本时:

./myscript --help
Run Code Online (Sandbox Code Playgroud)

我得到了我添加到脚本中的选项的详细响应:

Usage: myscript [options]

Options:
    -h, --help            show this help message and exit
    -u USER, --user=USER  resources owned by this username
Run Code Online (Sandbox Code Playgroud)

但是,当我实际执行我的脚本时:

./myscript --user myuser
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

usage: smyscript [-h] [--auth_host_name AUTH_HOST_NAME]
               [--noauth_local_webserver]
               [--auth_host_port [AUTH_HOST_PORT     
               [AUTH_HOST_PORT  ...]]]
               [--logging_level 
               {DEBUG,INFO,WARNING,ERROR,CRITICAL}]
 myscript: error: unrecognized arguments: --user myuser
Run Code Online (Sandbox Code Playgroud)

另一个要知道的重要事情是我正在使用我自己的模块包装oauth2client,如下所示:

import oauth2client
import argparse

def execute():

    parser = argparse.ArgumentParser(
            description=__doc__,
            formatter_class=argparse.RawDescriptionHelpFormatter,
            parents=[tools.argparser])
            # don't use any flags                                                                           
    flags = parser.parse_args(None)

    flow = client.flow_from_clientsecrets(
             client_secret_path,
             scope=scope_path,
             message=tools.message_if_missing(client_secret))
    # open credential storage path                                                                                                                                                                 
     credential_storage =  file.Storage(self._credential_storage_path)
     credentials = credential_storage.get()
     # get credentails if necessary                                                                                                                                                                 
     if credentials is None or credentials.invalid:
          credentials = tools.run_flow(flow, credential_storage, flags)                                                                                       
Run Code Online (Sandbox Code Playgroud)

然后我的脚本看起来像这样:

import myown_oauth2client_wrapper

from optparse import OptionParser

if __name__ == "__main__":
    usage = "something"
    parser_ = OptionParser(usage)

    parser_.add_option("-u","--user")
    (options_, args) = parser_.parse_args()

    myown_oauth2client_wrapper.execute()
Run Code Online (Sandbox Code Playgroud)

如何避免此选项覆盖?

沙哈尔

hpa*_*ulj 7

在上一个问题中,使用Python获取Youtube数据

我发现google api使用了argparse.

from outh2client.tools import argparser
Run Code Online (Sandbox Code Playgroud)

我的推论是它正在解析sys.argv导入时.

正如我在评论中所说,我们需要知道你得到的错误.'覆盖'是什么意思?有什么迹象?你得到一个解析器错误信息,由argparse或产生的那种optparse?如果是这样,什么消息.

向我们展示给出错误的命令行以及错误消息.

您可能希望调用脚本-h以查看解析帮助消息的人员/打印人员.


所以定义了那些和参数tools.argparserargparse解析器也是如此.在我之前回答的问题中,用户直接使用了该解析器(添加了自己的解析器).您正在使用该解析器. authloggingparent

parser = argparse.ArgumentParser(...
        parents=[tools.argparser])                                                                    
flags = parser.parse_args(None)
Run Code Online (Sandbox Code Playgroud)

它现在解析sys.argv.由于--user没有为此解析器定义,因此它提升了myscript: error: unrecognized arguments: --user myuser.

一种解决方案是使用:

flags, extras = parser.parse_known_args(None)
Run Code Online (Sandbox Code Playgroud)

现在我希望它能够运行,并且为了extras平等['--user', 'myuser'].

另一种选择是为此定义一个--user参数parser.

parser.add_argument('-u','--user',help='dummy user argument')
Run Code Online (Sandbox Code Playgroud)