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

时间:2015-12-31 18:00:56

标签: python google-oauth argparse optparse

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

一切都运行良好,但是当我导入google API oauth2client并运行其执行功能时,它会将我的add_options覆盖到它使用的选项中。

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

./myscript --help

我得到了我添加到脚本中的选项的详细回复:

Usage: myscript [options]

Options:
    -h, --help            show this help message and exit
    -u USER, --user=USER  resources owned by this username

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

./myscript --user myuser

我收到以下错误:

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

另一个要知道的重要事情是我正在使用我自己的模块来包装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)                                                                                       

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

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()

如何避免此选项覆盖?

沙哈尔

2 个答案:

答案 0 :(得分:7)

在上一个问题中,Getting Youtube data using Python

我发现google api使用argparse

from outh2client.tools import argparser

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

正如我在评论中所说,我们需要知道你得到的错误。 '覆盖'是什么意思?有什么迹象?您是否收到了argparseoptparse生成的解析器错误消息?如果是,那是什么消息。

向我们展示提供错误的命令行以及错误消息。

您可能希望使用-h调用脚本来查看解析帮助消息的人/打印内容。

所以tools.argparser是一个argparse解析器,定义了authlogging个参数。在我之前回答的问题中,用户直接使用了该解析器(添加了自己的解析器)。您正在使用该解析器作为parent

parser = argparse.ArgumentParser(...
        parents=[tools.argparser])                                                                    
flags = parser.parse_args(None)

现在解析sys.argv。由于未为此解析器定义--user,因此会引发myscript: error: unrecognized arguments: --user myuser

一种解决方案是使用:

flags, extras = parser.parse_known_args(None)

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

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

parser.add_argument('-u','--user',help='dummy user argument')

答案 1 :(得分:0)

我有一个相同的问题。发生问题是因为Google授权模块也使用argparse。您应该实现的是不共享该内存空间。我通过argparse接收参数来解决它,将它们加载到另一个对象中,但是在调用google模块之前,我做了以下事情:

import sys


sys.argv = [sys.argv[0]]

我的问题解决了。