Я написал несколько скриптов, которые я пытаюсь интегрировать с кликом. Все сценарии написаны в ООП 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 из-за того, что мой вывод не соответствует.
Я новичок в этой структуре кликов, при необходимости предложите любые новые изменения в моем подходе. ,
пожалуйста, посмотрите на это, извините за этот странный способ объяснить это.