각각의 하위 명령 세트가있는 Click 명령을 여러 파일로 분할하려면 어떻게해야합니까?
개발 한 큰 클릭 응용 프로그램이 하나 있지만 다른 명령 / 하위 명령을 탐색하는 것이 어려워지고 있습니다. 명령을 별도의 파일로 구성하려면 어떻게합니까? 명령과 하위 명령을 별도의 클래스로 구성 할 수 있습니까?
다음은이를 분리하는 방법의 예입니다.
초기화
import click
@click.group()
@click.version_option()
def cli():
pass #Entry Point
command_cloudflare.py
@cli.group()
@click.pass_context
def cloudflare(ctx):
pass
@cloudflare.group('zone')
def cloudflare_zone():
pass
@cloudflare_zone.command('add')
@click.option('--jumpstart', '-j', default=True)
@click.option('--organization', '-o', default='')
@click.argument('url')
@click.pass_obj
@__cf_error_handler
def cloudflare_zone_add(ctx, url, jumpstart, organization):
pass
@cloudflare.group('record')
def cloudflare_record():
pass
@cloudflare_record.command('add')
@click.option('--ttl', '-t')
@click.argument('domain')
@click.argument('name')
@click.argument('type')
@click.argument('content')
@click.pass_obj
@__cf_error_handler
def cloudflare_record_add(ctx, domain, name, type, content, ttl):
pass
@cloudflare_record.command('edit')
@click.option('--ttl', '-t')
@click.argument('domain')
@click.argument('name')
@click.argument('type')
@click.argument('content')
@click.pass_obj
@__cf_error_handler
def cloudflare_record_edit(ctx, domain):
pass
command_uptimerobot.py
@cli.group()
@click.pass_context
def uptimerobot(ctx):
pass
@uptimerobot.command('add')
@click.option('--alert', '-a', default=True)
@click.argument('name')
@click.argument('url')
@click.pass_obj
def uptimerobot_add(ctx, name, url, alert):
pass
@uptimerobot.command('delete')
@click.argument('names', nargs=-1, required=True)
@click.pass_obj
def uptimerobot_delete(ctx, names):
pass
CommandCollection
이를 위해 사용하는 단점은 명령을 병합하고 명령 그룹에서만 작동한다는 것입니다. imho 더 나은 대안은 add_command
동일한 결과를 얻기 위해 사용 하는 것입니다.
다음 트리가있는 프로젝트가 있습니다.
cli/
├── __init__.py
├── cli.py
├── group1
│ ├── __init__.py
│ ├── commands.py
└── group2
├── __init__.py
└── commands.py
각 하위 명령에는 자체 모듈이 있으므로 더 많은 도우미 클래스와 파일을 사용하여 복잡한 구현도 매우 쉽게 관리 할 수 있습니다. 각 모듈에서 commands.py
파일은 @click
주석을 포함합니다 . 예 group2/commands.py
:
import click
@click.command()
def version():
"""Display the current version."""
click.echo(_read_version())
필요한 경우 모듈에서 더 많은 클래스를 쉽게 생성 import
하고 여기에서 사용할 수 있으므로 CLI에 Python의 클래스 및 모듈을 최대한 활용할 수 있습니다.
My cli.py
는 전체 CLI의 진입 점입니다.
import click
from .group1 import commands as group1
from .group2 import commands as group2
@click.group()
def entry_point():
pass
entry_point.add_command(group1.command_group)
entry_point.add_command(group2.version)
이 설정을 사용하면 관심사별로 명령을 매우 쉽게 분리하고 필요한 추가 기능을 빌드 할 수 있습니다. 그것은 지금까지 나를 아주 잘 섬겼습니다 ...
참조 : http://click.pocoo.org/6/quickstart/#nesting-commands
프로젝트의 구조가 다음과 같다고 가정합니다.
project/
├── __init__.py
├── init.py
└── commands
├── __init__.py
└── cloudflare.py
Groups are nothing more than multiple commands and groups can be nested. You can separate your groups into modules and import them on you init.py
file and add them to the cli
group using the add_command.
Here is a init.py
example:
import click
from .commands.cloudflare import cloudflare
@click.group()
def cli():
pass
cli.add_command(cloudflare)
You have to import the cloudflare group which lives inside the cloudflare.py file. Your commands/cloudflare.py
would look like this:
import click
@click.group()
def cloudflare():
pass
@cloudflare.command()
def zone():
click.echo('This is the zone subcommand of the cloudflare command')
Then you can run the cloudflare command like this:
$ python init.py cloudflare zone
This information is not very explicit on the documentation but if you look at the source code, which is very well commented, you can see how groups can be nested.
I'm looking for something like this at the moment, in your case is simple because you have groups in each of the files, you can solve this problem as explained in the documentation:
In the init.py
file:
import click
from command_cloudflare import cloudflare
from command_uptimerobot import uptimerobot
cli = click.CommandCollection(sources=[cloudflare, uptimerobot])
if __name__ == '__main__':
cli()
The best part of this solution is that is totally compliant with pep8 and other linters because you don't need to import something you wouldn't use and you don't need to import * from anywhere.
I'm not an click expert, but it should work by just importing your files into the main one. I would move all commands in separate files and have one main file importing the other ones. That way it is easier to control the exact order, in case it is important for you. So your main file would just look like:
import commands_main
import commands_cloudflare
import commands_uptimerobot
ReferenceURL : https://stackoverflow.com/questions/34643620/how-can-i-split-my-click-commands-each-with-a-set-of-sub-commands-into-multipl
'IT story' 카테고리의 다른 글
SQL Server Management Studio에서 비활성화 된 오른쪽 클릭 스크립트 변경 테이블 (0) | 2020.12.30 |
---|---|
푸시 된 후 병합 되돌리기 (0) | 2020.12.30 |
불투명 한 응답에는 어떤 제한이 적용됩니까? (0) | 2020.12.30 |
Python에서 렉싱, 토큰 화 및 구문 분석을위한 리소스 (0) | 2020.12.30 |
Hibernate : HQL로 NULL 쿼리 매개 변수 값을 설정하는 방법은 무엇입니까? (0) | 2020.12.30 |