我编写了一个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()
如何避免此选项覆盖?
沙哈尔
答案 0 :(得分:7)
在上一个问题中,Getting Youtube data using Python
我发现google api使用argparse
。
from outh2client.tools import argparser
我的推论是它在导入时正在解析 sys.argv
。
正如我在评论中所说,我们需要知道你得到的错误。 '覆盖'是什么意思?有什么迹象?您是否收到了argparse
或optparse
生成的解析器错误消息?如果是,那是什么消息。
向我们展示提供错误的命令行以及错误消息。
您可能希望使用-h
调用脚本来查看解析帮助消息的人/打印内容。
所以tools.argparser
是一个argparse
解析器,定义了auth
和logging
个参数。在我之前回答的问题中,用户直接使用了该解析器(添加了自己的解析器)。您正在使用该解析器作为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]]
我的问题解决了。