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)
如何避免此选项覆盖?
沙哈尔
在上一个问题中,使用Python获取Youtube数据
我发现google api使用了argparse.
from outh2client.tools import argparser
Run Code Online (Sandbox Code Playgroud)
我的推论是它正在解析sys.argv导入时.
正如我在评论中所说,我们需要知道你得到的错误.'覆盖'是什么意思?有什么迹象?你得到一个解析器错误信息,由argparse或产生的那种optparse?如果是这样,什么消息.
向我们展示给出错误的命令行以及错误消息.
您可能希望调用脚本-h以查看解析帮助消息的人员/打印人员.
所以定义了那些和参数tools.argparser的argparse解析器也是如此.在我之前回答的问题中,用户直接使用了该解析器(添加了自己的解析器).您正在使用该解析器. 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)