Вот мой пример кода:
def function1():
parser = argparse.ArgumentParser(description='Test Cascading Utility')
parser.add_argument('--number', type=str, help='Enter number')
args = parser.parse_args()
x = str(args.number)
squares = float(x)**2
def function2():
parser = argparse.ArgumentParser(description='Test Cascading Utility')
parser.add_argument('--number1', type=str, help='Enter number')
parser.add_argument('--number2', type=str, help='Enter number')
args = parser.parse_args()
x = str(args.number1)
y = str(args.number2)
div = float(x)/float(y)
def main():
choice = sys.argv[1]
if choice == 'Y':
function1()
elif choice == 'N':
function2()
else:
print("Come on, choose a Y or N option.")
if __name__ == '__main__':
main()
Я пытаюсь создать каскадный инструмент cli, в котором на основе одного введенного мной параметра запускается определенный метод. Этот метод, в свою очередь, будет иметь собственный набор аргументов.
Этот конкретный код вызывает ошибку: error: unrecognized arguments: Y
Это наводит меня на мысль, что системный аргумент «выбор» переопределяется парсером аргументов, поэтому как я могу реализовать этот каскадный эффект, если на основе выбора я запускаю метод.
Я впервые вникаю в argparse
, и поэтому, пожалуйста, потерпите меня, если вопрос окажется глупым. Но это то, что я действительно хотел бы реализовать.
parse_args
смотрит на sys.argv[1:]
. Ваш choice
находится в этом списке. Вы должны либо удалить его перед вызовом функции, либо написать синтаксический анализатор, чтобы он не подавился этой строкой. Другая возможность - передать список argv
функции и использовать parse_args(argv)
.
Механизм субпарсера также может обрабатывать этот интерфейс командной строки. Определите подпараметры «Y» и «N» и дайте каждому необходимые аргументы.
Это должно дать вам некоторые идеи: stackoverflow.com/questions/52103324/…
Я бы порекомендовал вам использовать щелчок. Это делает эти вещи очень простыми
Вам нужно использовать группы и, возможно, объединение нескольких команд
http://click.pocoo.org/5/commands/#group-invocation-without-commandhttp://click.pocoo.org/5/commands/#multi-command-chaining
Вы можете создавать группы и подкоманды. Затем в каждой подкоманде вызывайте исходные функции, с которыми вы интегрируетесь.
Я не могу изменить функции, так как собираюсь интегрировать чужой код в свой. Я не хочу вносить изменения в сами функции. Я не думаю, что Click может помочь мне в этом. Если это возможно, я хотел бы знать, как это сделать, поскольку я уже использовал щелчок раньше и не смог реализовать каскадный эффект.
Вы пропустили вопрос click
: stackoverflow.com/questions/51874185/…
ArgumentParser предназначен для анализа аргументов, которые передаются приложению при его запуске. Вы получаете эти аргументы только при запуске приложения. Вы не можете создавать отдельные ArgParsers в таких отдельных функциях и ожидать, что они будут иметь значения.