想象一下,我有一个带有许多不同命令的大型 CLI 应用程序(例如 image-magick)。
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 可以使用类似的模式吗?我可以创建一个“单击应用程序”(可能是扩展click.Group
),在其中注册作为单个命令的“控制器”吗?