导入的 python 模块覆盖了选项解析器
Imported python module overrides option parser
我写了一个 python 实用程序脚本,它使用 optparse 在脚本启动时包含选项和标志。
一切正常,但是当我导入 google API oauth2client 和 运行 它的执行函数时,它会覆盖我的 add_options
到它使用的选项中。
当我说 'overrides' 时,我的意思是即使我的脚本向我的选项解析器添加了选项,当我像这样执行脚本时:
./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()
如何避免此选项被覆盖?
沙哈尔
在上一个问题中,Getting Youtube data using Python
我发现 google api 使用 argparse
.
from outh2client.tools import argparser
我的推断是导入的时候在解析sys.argv
正如我在评论中所问,我们需要知道您遇到了什么错误。 'overrides' 是什么意思?这说明什么?您是否收到由 argparse
或 optparse
生成的解析器错误消息?如果是,是什么消息。
向我们显示出现错误的命令行以及错误消息。
您可能希望使用 -h
调用脚本以查看 who/what 打印解析帮助消息。
所以 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']
。
另一种选择是为此parser
定义一个--user
参数。
parser.add_argument('-u','--user',help='dummy user argument')
我遇到了同样的问题。出现问题是因为 google 授权模块也使用了 argparse。你应该做到的是不共享那段记忆space。我通过 argparse 接收参数解决了这个问题,将它们加载到另一个对象中,但是在调用 google 模块之前我做了以下操作:
import sys
sys.argv = [sys.argv[0]]
我的问题解决了。
我写了一个 python 实用程序脚本,它使用 optparse 在脚本启动时包含选项和标志。
一切正常,但是当我导入 google API oauth2client 和 运行 它的执行函数时,它会覆盖我的 add_options
到它使用的选项中。
当我说 'overrides' 时,我的意思是即使我的脚本向我的选项解析器添加了选项,当我像这样执行脚本时:
./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()
如何避免此选项被覆盖?
沙哈尔
在上一个问题中,Getting Youtube data using Python
我发现 google api 使用 argparse
.
from outh2client.tools import argparser
我的推断是导入的时候在解析sys.argv
正如我在评论中所问,我们需要知道您遇到了什么错误。 'overrides' 是什么意思?这说明什么?您是否收到由 argparse
或 optparse
生成的解析器错误消息?如果是,是什么消息。
向我们显示出现错误的命令行以及错误消息。
您可能希望使用 -h
调用脚本以查看 who/what 打印解析帮助消息。
所以 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']
。
另一种选择是为此parser
定义一个--user
参数。
parser.add_argument('-u','--user',help='dummy user argument')
我遇到了同样的问题。出现问题是因为 google 授权模块也使用了 argparse。你应该做到的是不共享那段记忆space。我通过 argparse 接收参数解决了这个问题,将它们加载到另一个对象中,但是在调用 google 模块之前我做了以下操作:
import sys
sys.argv = [sys.argv[0]]
我的问题解决了。