Импортированный модуль Python переопределяет парсер опций
Я написал скрипт утилиты 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()
Как я могу избежать переопределения этой опции?
Шахар
1 ответ
В предыдущем вопросе, Получение данных Youtube с использованием 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')
У меня была такая же проблема. Проблема возникает из-за того, что модуль авторизации Google также использует argparse. Вам следует не разделять это пространство памяти. Я решил это, получив аргументы через argparse, загрузив их в другой объект, но затем перед вызовом модулей Google я сделал следующее:
import sys
sys.argv = [sys.argv[0]]
и моя проблема была решена.