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

6

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

一切正常,但是当我导入Google API oauth2client并运行其execute函数时,它会覆盖我的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()

我该如何避免选项覆盖?
沙哈尔

请更具体地描述您遇到的错误。我怀疑它是否改变了您的“parser_”。更可能的是,它正在实现自己的解析器(基于“argparse”),并解析相同的“sys.argv”。错误消息将给出提示。还有其他涉及“google”“api”的“argparse”问题。 - hpaulj
告诉我们你正在导入哪个模块,调用了哪个函数以及为什么认为 add_option 已被覆盖,你觉得怎么样? - tdelaney
没有足够的信息来回答这个问题,而且由于发帖人甚至不告诉我们调用了哪个函数,所以需要关闭。 - tdelaney
嘿@tdelaney,感谢您的回复。我已经编辑了我的问题以添加缺少的细节。希望现在更好了。 - ShaharA
2个回答

7
在之前的问题中,我发现谷歌api使用了argparse。请参见使用Python获取Youtube数据
from outh2client.tools import argparser

我的推断是在导入时解析了sys.argv
正如我在评论中问到的,我们需要知道你遇到了什么错误。你所说的“覆盖”是什么意思?有什么迹象吗?你是否得到了解析器错误消息,这种错误消息由argparseoptparse产生?如果是这样,那么是什么消息?
向我们展示给出错误的命令行以及错误消息。
您可能希望使用-h调用脚本以查看谁/什么打印解析帮助消息。

因此,tools.argparser 是一个带有 authlogging 参数定义的 argparse 解析器。在我之前回答的问题中,用户直接使用了该解析器(并添加了自己的内容)。你将该解析器用作一个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']
另一种选择是为这个parser定义一个--user参数。
parser.add_argument('-u','--user',help='dummy user argument')

0
我曾经遇到过同样的问题。这个问题是由于谷歌授权模块也使用了argparse导致的。你需要做的是不要共享那个内存空间。我通过使用argparse接收参数,将它们加载到另一个对象中来解决了这个问题,但在调用谷歌模块之前,我做了以下操作:
import sys


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

我的问题已经解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接