7

多くの異なるコマンド (image-magick など) を備えた大きな CLI アプリケーションがあるとします。

このアプリケーションをモジュールなどに整理したかったので、click.groupどこかにマスターがあります。

#main.py file
@click.group()
def my_app():
    pass

if __name__ == "__main__":
    my_app()

コマンドを定義する各モジュールにインポートできます。

from main import my_app

# command_x.py
@my_app.command() 
def command_x():
    pass

main.py問題は、ファイルが何も認識しておらずcommand_x.py、メイン セクションを呼び出す前にインポートする必要があるため、循環インポートの問題が発生することです。

これは Flask でも発生し、通常はアプリ ファクトリ パターンで処理されます。通常、ビューの前にアプリを作成します。

app = Flask("my_app")

@my_app.route("/")
def view_x():
   pass

if __name__ == "__main__":
    app.run()

アプリ ファクトリ パターンでは、ブループリントの「登録」を延期します。

# blueprints.py
blueprint = Blueprint(yaddayadda)

@blueprint.route("/")
def view_x():
    pass

そして、アプリをビルドしてブループリントを登録する方法を知っているファクトリを作成します。

#app_factory.py
from blueprints import view_x

def create_app():
    app = Flask()
    view_x.init_app(app)
    return app

そして、アプリを実行するスクリプトを作成できます。

#main.py

from app_factory import create_app

if __name__ == "__main__":
    app = create_app()
    app.run()

クリックで同様のパターンを使用できますか? click.Group個々のコマンドである「コントローラー」を登録する「クリックアプリ」(おそらく拡張)を作成できますか?

4

2 に答える 2

3

遅いかもしれませんが、コマンドを個別のモジュールに配置するソリューションも探していました。デコレーターを使用して、モジュールからコマンドを挿入するだけです。

#main.py file
import click
import commands

def lazyloader(f):
    # f is an instance of click.Group
    f.add_command(commands.my_command)
    return f

@lazyloader
@click.group()
def my_app():
    pass

if __name__ == "__main__":
    my_app()

分離されたコマンドは、クリックから通常のデコレータを使用できます。

#commands.py
import click

@click.command()
def my_command():
    pass
于 2015-12-18T14:20:58.770 に答える