をクリックしてサブコマンドを使用してPython CLIを開発する


Pythonアプリケーションを使用してCLIアプリケーションを開発するには、すでに大きな投稿がありますClick 単一のPythonファイルから設定されているコマンドの例を示すライブラリですが、コマンドを自分の個々のPythonファイルに整理したい場合もあります.
私はCLIアプリケーションを構築している間、同様の要件を持っていました、そして、私が一緒に配線して、マイナーな誤りを解決したい構造を得るのにかなりの時間を費やしました.このチュートリアルでは、CLIアプリケーションの正常に動作する例を開発する方法を示します.
このチュートリアルでは、複数のコマンドを持つCLIアプリケーションを開発しますbuild and deploy このように:
$ python3 main.py
Usage: main.py [OPTIONS] COMMAND [ARGS]...

  CLI tool to manage full development cycle of projects

Options:
  --help  Show this message and exit.

Commands:
  build
  deploy

  • 次の構造体と空白のPythonファイルを次のように新しいプロジェクトディレクトリを作成します
    $ tree
    .
    ├── commands
    │   ├── __init__.py
    │   ├── build.py
    │   ├── deploy.py
    └── main.py
    
    1 directory, 4 files
    
    内部の別のPythonファイルを作成することができますcommands あなたのメインCLIに公開する各コマンドのdir.

  • インストールclick これを使ったPythonライブラリ
    pip3 install click
    

  • のスタートコードから始めましょうmain.py :
    import click
    
    @click.group(help="CLI tool to manage full development cycle of projects")
    def cli():
        pass
    
    if __name__ == '__main__':
        cli()
    
    📌 スターター機能を注釈したことに注意してくださいcli() with @click.group これがコマンド群であることを示します.

  • この部分が正常に動作することを確認します.
    $ python3 main.py
    Usage: main.py [OPTIONS] COMMAND [ARGS]...
    
      CLI tool to manage full development cycle of projects
    
    Options:
      --help  Show this message and exit.
    

  • 次のコードを書きましょうbuild サブコマンドcommands/build.py :
    import click
    
    @click.command()
    @click.option('--docker', is_flag=True, help='Indicates the project should be built into docker image')
    def build(docker):
        if docker:
            print(f'Building this repo into a docker image...')
        else:
            print(f'Building this repo using default method...')
    
    📌 前進する前にこれらのポイントに注意してください.
  • 関数を定義しましたbuild(docker) これは@click.command() これがコマンドであることを示す.
  • オプションのboolean型を定義する--docker for build 値が渡されるコマンドbuild() 関数.ここで追加のオプションを定義できますbuild ここでこのコマンドのためにあなた自身のロジックをコマンドして、書きます.

  • この時点で、メインのコマンド群を作成しました.pyは“cli”と呼ばれる別のコマンド“build”と呼ばれますが、まだそれらを結び付けていません.
    これを加えましょうbuild メイングループへのコマンド
    6.1 .インポートコマンド/ビルドライブラリmain.py :
      from commands import build
    
    6.2 .追加build メイングループへのコマンドmain.py :
      cli.add_command(build.build)
    
    📌 注意:
  • 我々はadd_command() on cli の代わりにclick オブジェクト
  • 追加build.build の代わりにbuild

  • 実行できることを確認しますbuild メインプログラムのサブコマンドとして:
    $ python3 main.py build --help
    Usage: main.py build [OPTIONS]
    
    Options:
      --docker  Indicates the project should be built into docker image
      --help    Show this message and exit.
    
  • 📌 この時点で作業構造を持っているならば、コマンド/ディレクトリまたは他のdirの下で別々のPythonファイルに新しいサブコマンドを加えるための同様のプロセスに簡単に従うことができます.
    例えば、aを加えましょうdeploy 主なCLIプログラムへのサブコマンド機能.このサブコマンドは--env and --cloud ) そして、許可された値とデフォルト値を表示している間、ユーザーに入力を入力させてください.

  • 機能と利用可能なオプションの定義deploy サブコマンド:
    import click
    
    @click.command()
    @click.option('--env', '-e', default="dev", type=click.Choice(['dev', 'stg', 'prd'], case_sensitive=False), prompt='Enter env name to deploy', help='Env to deploy')
    @click.option('--cloud', '-c', default="aws", type=click.Choice(['aws', 'gcp', 'azure'], case_sensitive=False), prompt='Enter cloud to deploy to', help='Cloud to deploy to')
    def deploy(env, cloud):
        print(f'Deploying current application artifact to {env} environment in {cloud} cloud...')
    

  • インポートこの新しいdeploy メインコマンド
    from commands import deploy
    

  • 追加deploy メインコマンド
    cli.add_command(deploy.deploy)
    

  • 実行できることを確認しますdeploy サブコマンド:
    $ python3 main.py deploy
    Enter env name to deploy (dev, stg, prd) [dev]: 
    Enter cloud to deploy to (aws, gcp, azure) [aws]: 
    Deploying current application artifact to dev environment in aws cloud...
    
  • 🏁 🏆 このチュートリアルが役に立ちましたので、別のPythonファイル/dirに編成されたコマンドで作業CLI構造を実装するのを助けてください.コメントや質問にフィードバックを残してお気軽に.🔚
    🛎 追記:上記のファイルの最終版は参考文献です.

    メイン.パイ
    import click
    
    from commands import build
    from commands import deploy
    
    
    @click.group(help="CLI tool to manage full development cycle of projects")
    def cli():
        pass
    
    
    cli.add_command(build.build)
    cli.add_command(deploy.deploy)
    
    if __name__ == '__main__':
        cli()
    

    コマンド/ビルド.パイ
    import click
    
    @click.command()
    @click.option('--docker', is_flag=True, help='Indicates the project should be built into docker image')
    def build(docker):
        if docker:
            print(f'Building this repo into a docker image...')
        else:
            print(f'Building this repo using default method...')
    

    コマンド.パイ
    import click
    
    @click.command()
    @click.option('--env', '-e', default="dev", type=click.Choice(['dev', 'stg', 'prd'], case_sensitive=False), prompt='Enter env name to deploy', help='Env to deploy')
    @click.option('--cloud', '-c', default="aws", type=click.Choice(['aws', 'gcp', 'azure'], case_sensitive=False), prompt='Enter cloud to deploy to', help='Cloud to deploy to')
    def deploy(env, cloud):
        print(f'Deploying current application artifact to {env} environment in {cloud} cloud...')