使用 @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 查看哈希)