[解決済み] クリックコマンドを複数のファイルに分割するにはどうすればよいですか?
2022-10-19 05:06:22
質問
ある大きなクリックアプリケーションを開発したのですが、さまざまなコマンドやサブコマンドをナビゲートするのが面倒になってきました。コマンドを別のファイルに整理するにはどうしたらよいでしょうか。コマンドとそのサブコマンドを別々のクラスに整理することは可能でしょうか?
どのように分けたいかの例です。
init
import click
@click.group()
@click.version_option()
def cli():
pass #Entry Point
コマンド_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
コマンド_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
を使うことの欠点は、コマンドをマージしてしまうことと、コマンドグループに対してのみ動作することです。より良い代替案は
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のクラスとモジュールのフルパワーを与えることができます。
私の
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)
このセットアップを使用すると、懸念事項によってコマンドを分離することが非常に簡単になり、また、それらの周りに必要な追加の機能を構築することができます。これまでのところ、これは私にとても役立っています...
関連
-
[解決済み] Pythonで "with open "を使って複数のファイルを開くにはどうしたらいいですか?
-
[解決済み] リストを均等な大きさの塊に分割するには?
-
[解決済み] Pythonのsuper()は多重継承でどう動くのか?
-
[解決済み] 指定されたディレクトリ内のファイルを反復処理するにはどうすればよいですか?
-
[解決済み] 文字列を複数の単語境界のデリミタで単語に分割する
-
[解決済み] 文字列の各単語の最初の文字を大文字にするにはどうすればよいですか?
-
[解決済み] 複数のcsvファイルをpandasにインポートし、1つのDataFrameに連結する。
-
[解決済み] 文字列をリストに分割するには?
-
[解決済み] Python 3でバイナリデータを標準出力に書き込むには?
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 前月の日時オブジェクトを返す
-
[解決済み] PythonでのAWS Lambdaのインポートモジュールエラー
-
[解決済み] SQLAlchemy: セッションの作成と再利用
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] タプルのリストを複数のリストに変換するには?
-
[解決済み] 文字列のリストを内容に基づいてフィルタリングする
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] pycharmがタブをスペースに自動変換する
-
[解決済み] Pythonの辞書にあるスレッドセーフについて