跳转到主要内容

使用 @main 简化项目入口

项目描述

@main.py

mainpy - PyPI mainpy - Python Versions mainpy - license

mainpy - CI mainpy - pre-commit mainpy - basedpyright mainpy - ruff


基本示例

使用 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库兼容良好,例如 clicktyper

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 的 开发模式。这会做三件事

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

上传时间 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面