使用 @main 简化项目入口
项目描述
@main.py
基本示例
使用 mainpy,不再需要编写 if __name__ == '__main__' 的样板代码
不使用 mainpy |
使用 mainpy |
|---|---|
if __name__ == '__main__':
app()
def app(): ...
|
from mainpy import main
@main
def app(): ...
|
对于异步应用程序,改进变得更加明显
不使用 mainpy |
使用 mainpy |
|---|---|
import asyncio
async def async_app(): ...
if __name__ == '__main__':
with asyncio.Runner() as runner:
runner.run(async_app())
|
from mainpy import main
@main
async def async_app(): ...
|
外部库
尽管 mainpy 除了 typing_extensions (在Python < 3.10) 以外不需要其他依赖项,但它可选支持 uvloop,并且与流行的CLI库兼容良好,例如 click 和 typer。
uvloop
如果您已安装 uvloop,mainpy 将在运行您的异步主函数之前自动调用 uvloop.install()。可以通过设置 use_uvloop=False 来禁用此功能,例如。
@main(use_uvloop=False)
async def app(): ...
Click
使用 click,您可以像往常一样添加装饰器。
![重要] 必须在
@click.command()之前放置 在前面@mainpy.main装饰器。
import mainpy
import click
@mainpy.main
@click.command()
def click_command():
click.echo('Hello from click_command')
被 @mainpy.main 装饰的函数将立即执行。但必须在命令函数之前定义一个 @click.group。在这种情况下,应该 之后 所有设置都完成之后调用 mainpy.main。
import mainpy
import click
@click.group()
def group(): ...
@group.command()
def command(): ...
mainpy.main(group)
Typing
typer 在定义命令之后内部进行一些初始化。您不应在命令本身上使用 @mainpy.main,而应手动使用 mainpy.main()。
import mainpy
import typer
app = typer.Typer()
@app.command()
def command():
typer.echo('typer.Typer()')
mainpy.main(command)
调试模式
可选地,可以通过将 debug=True 传递给 mainpy.main 来模拟 Python 的 开发模式。这会做三件事
- 启用 faulthandler
- 配置
warnings以显示所有警告 - 以 调试模式 运行
async函数
@main(debug=True)
def app(): ...
安装
对于 Python $\ge 3.8$,mainpy 包可在 pypi 上找到
pip install mainpy
此外,您还可以安装 uvloop 扩展,这将安装 uvloop>=0.14(除非您在 Windows 上)
pip install mainpy[uvloop]
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪一个,请了解更多关于 安装包 的信息。
源分布
mainpy-1.4.0.tar.gz (7.1 kB 查看哈希)
构建分布
mainpy-1.4.0-py3-none-any.whl (5.7 kB 查看哈希)