python click framework - пользовательская реализация нескольких команд в методе oop - PullRequest
1 голос
/ 10 октября 2019

Я написал несколько скриптов, которые я пытаюсь интегрировать с кликом. Все сценарии написаны в ООП Python.

Проблема в том, что я пытаюсь построить командный раздел по-другому, но не могу сделать это правильно.

позвольте мне показать вам, что я пытаюсь сделать, и обратите внимание, что яЯ делюсь здесь фиктивным кодом, он очень похож на реальный код.

Прежде всего, структура каталогов:

-customcmd <dir>
|
|->commands <dir>
|  -> abc-command.py
|  -> __init__.py
|
|->__init__.py
|->main.py
|->setup.py

1) Я создал один файл с именем main.py, который содержит следующиекод:

import click
import os

plugin_folder = os.path.join(os.path.dirname(__file__), 'commands')

class MyCLI(click.MultiCommand):

    def list_commands(self, ctx):
        rv = []
        for filename in os.listdir(plugin_folder):
            if filename.startswith('__'):
                continue
            if filename.endswith('.py'):
                rv.append(filename[:-3])
        rv.sort()
        return rv

    def get_command(self, ctx, name):
        ns = {}
        fn = os.path.join(plugin_folder, name + '.py')
        with open(fn) as f:
            code = compile(f.read(), fn, 'exec')
            eval(code, ns, ns)
        return ns['cli']

cli = MyCLI()#help='This tool\'s subcommands are loaded from a ''plugin folder dynamically.'
if __name__ == '__main__':
    cli()

2) abc-command.py

@click.command()
@click.option("--file-loc", '-fl', type=open, required=True, default=None, help="Path to the file")

def cli(file_loc):
    """ 
        This is test command

    """
    print("Path to file {}".format(file_loc))

  • Вывод вышеуказанного кода при вызове main.py:
(automation) K:\Pythonenv\automation\customcmd>python main.py
Usage: main.py [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  policyresult  This is test command
  • Вывод приведенного выше кода при вызове подкоманды:
(automation) K:\Pythonenv\automation\customcmd>python main.py policyresult --help
Usage: main.py policyresult [OPTIONS]

  This is test command

Options:
  -fl, --file-loc OPEN    Path to the file  [required]
  --help                  Show this message and exit.

3) Вот как я преобразовал процедурный код кода abc-command.py:

  class policyresult():



    def __init__(self):
        pass


    @click.command()
    @click.option("--file-loc", '-fl', type=open, required=True, default=None, help="Path to the file")

    def cli(self,file_loc):
        """ 
            This is test command

        """
        print("Path to file {}".format(file_loc))



obj = policyresult()
obj.cli()

  • Вывод вышеуказанного кода не совпадает с предыдущим выводом, когда код был процедурным в abc-command.py:

Здесь я вызываю main.py

(automation) K:\Pythonenv\automation\customcmd>python main.py
Usage: main.py [OPTIONS]
Try "main.py --help" for help.

Error: Missing option "--file-loc" / "-fl".

В приведенном выше выводе вы можете видеть, что он непосредственно входит в параметры подкоманды и также выдает ошибку.

Насколько я понимаю, list_commands (), который находится в main.py, не может перечислить команды, в этой части я не могу понять, почему он не работает должным образом.

Я пробовал разные вещи, ноНе удалось найти правильный способ реализации ООП в файле abc-command.py из-за того, что мой вывод не соответствует.

Я новичок в этой структуре кликов, при необходимости предложите любые новые изменения в моем подходе. ,

пожалуйста, посмотрите на это, извините за этот странный способ объяснить это.

1 Ответ

0 голосов
/ 22 октября 2019

abc-command.py оценивается перед анализом параметров команды щелчком мыши, так как эта строка в файле вызывает метод cli:

obj.cli()

Кроме того, в методе get_command, реализованном для мульти-команда, команды должны предоставлять имя 'cli' в своем пространстве имен.

Чтобы исправить эту ошибку, в abc-command.py обновите строку, вызывая команду cli, с помощью:

cli = obj.cli
...