Импортированный модуль 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]]

и моя проблема была решена.

Другие вопросы по тегам