ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Portal Gun

Portal Gun Portal Gun【免费下载链接】typerTyper, build great CLIs. Easy to code. Based on Python type hints.项目地址: https://gitcode.com/GitHub_Trending/ty/typerThe awesome Portal Gun## 添加命令入口[project.scripts] 我们要做一个能用 uv add 或 pip install 安装的包同时希望它向 shell 暴露一个可执行程序。这一步只需在 pyproject.toml 的 [project.scripts] 段加一行配置 toml [project] name rick-portal-gun version 0.1.0 description Add your description here readme README.md authors [Rick Sanchez rickexample.com] requires-python 3.14 dependencies [ typer0.21.0, ] [project.scripts] rick-portal-gun rick_portal_gun.main:app [build-system] requires [uv_build0.8.14,0.9.0] build-backend uv_build这一行rick-portal-gun rick_portal_gun.main:app拆开来看rick-portal-gun安装后出现在终端里的 CLI 程序名带连字符。安装后直接这样调用$ rick-portal-gun // 这里会发生一些事情 ✨rick_portal_gun.main下划线部分要导入的 Python 模块等价于from rick_portal_gun.main import # 这里导入某个东西app从该模块导入并当作函数调用的对象等价于from rick_portal_gun.main import app app()也就是说这一配置告诉 uv安装这个包时创建一个名为rick-portal-gun的命令行程序它实际调用的是rick_portal_gun.main模块中的app对象。当前仓库也正是用完全相同的机制暴露了typer命令见 pyproject.toml。安装你的包uv sync现在包已经具备安装条件执行$ uv sync Resolved 10 packages in 1ms Built rick-portal-gun file:/home/rick-portal-gun Prepared 1 package in 18ms Uninstalled 1 package in 1ms Installed 1 package in 13ms ~ rick-portal-gun0.1.0 (from file:/home/rick-portal-gun)uv sync会按uv.lock把项目自身可编辑/已构建形式装进.venv。试运行你的 CLI 程序包已装入 uv 创建的环境立刻就能用// 用 which 检查哪个 rick-portal-gun 可用如果有 $ which rick-portal-gun // 拿到的是当前环境中的那个 /home/rick-portal-gun/.venv/bin/rick-portal-gun // 试试看 $ rick-portal-gun --help // 得到完整的标准帮助信息 Usage: rick-portal-gun [OPTIONS] COMMAND [ARGS]... Awesome Portal Gun Options: --install-completion Install completion for the current shell. --show-completion Show completion for the current shell, to copy it or customize the installation. --help Show this message and exit. Commands: shoot Shoot the portal gun load Load the portal gun注意帮助输出里已经自动带上了--install-completion/--show-completion两个选项以及两个子命令的 docstring 说明——这些都由 Typer 基于代码自动生成。构建 wheel 包uv buildPython 包的标准分发格式叫wheel是.whl结尾的文件。用 uv 构建$ uv build Building source distribution (uv build backend)... Building wheel from source distribution (uv build backend)... Successfully built dist/rick_portal_gun-0.1.0.tar.gz Successfully built dist/rick_portal_gun-0.1.0-py3-none-any.whl构建后项目目录里多出./dist/. ├── dist │ ├── rick_portal_gun-0.1.0-py3-none-any.whl │ └── rick-portal-gun-0.1.0.tar.gz ├── pyproject.toml ├── README.md ├── ....whl就是 wheel 文件可以把它发给任何人直接安装后面还会讲到发布到 PyPI。隔离测试 wheeluv tool install打开另一个终端把 wheel 作为独立的命令行工具安装$ uv tool install /home/rick/rick-portal-gun/dist/rick_portal_gun-0.1.0-py3-none-any.whl --- 100%提示uv tool install会把工具装进它自己独立的隔离环境避免与你的项目环境和系统 Python 冲突。这正是 Typer 文档推荐的分发验证方式。现在 CLI 已经全局可用随便用$ rick-portal-gun shoot // 成功 Shooting portal gun全局安装补全因为程序是全局安装的而不是只在某个项目环境里现在可以为它安装全局补全$ rick-portal-gun --install-completion zsh completion installed in /home/rick/.zshrc. Completion will take effect once you restart the terminal.提示想移除补全直接删除该文件中被追加的那一行即可。重启终端后补全即可生效$ rick-portal-gun [TAB][TAB] // 得到你 CLI 程序的补全 ✨ load -- Load the portal gun shoot -- Shoot the portal gun可选支持python -m调用很多模块可以用python -m some-module的方式当作脚本调用。比如安装 pip 常用pip install fastapi但也可以$ python -m pip install fastapi这里-m的值是pipPython 会像执行脚本一样执行pip模块并把后面的 CLI 参数install fastapi传给它两者基本等价。提示对pip而言很多时候推荐用python -m pip如果你创建了带自己python的虚拟环境这样能确保用的是那个环境的pip。添加__main__.py要让自己的包也支持python -m调用只需在包内加一个__main__.py文件——Python 会自动寻找并执行它无需在pyproject.toml或任何地方引用这是标准 Python 行为. ├── pyproject.toml ├── README.md ├── src │ └── rick_portal_gun │ ├── __init__.py │ ├── __main__.py │ └── main.py └── uv.lock__main__.py内容为from .main import app app()安装包后即可这样调用$ python -m rick_portal_gun --help Usage: python -m rick_portal_gun [OPTIONS] COMMAND [ARGS]... Awesome Portal Gun Options: --install-completion Install completion for the current shell. --show-completion Show completion for the current shell, to copy it or customize the installation. --help Show this message and exit. Commands: shoot Shoot the portal gun load Load the portal gun成功了 注意此时必须传可导入的包名即rick_portal_gun下划线而不是rick-portal-gun连字符。补全与python -m的关系请注意使用python -m时 TAB 补全不会生效。自动补全依赖被调用程序的名称它与每个具体的程序名绑定。要为rick-portal-gun获得 shell 补全必须直接调用$ rick-portal-gun [TAB][TAB]但python -m仍然值得支持它在某些场景下非常方便。可选发布到 PyPI把包公开到 PyPI 后其他人就能直接安装。先去 PyPI 注册账号免费。配置 PyPI API Token登录 PyPI 后在账号管理页面https://pypi.org/manage/account/token/创建一个新 token。假设你的 token 是pypi-wubalubadubdub-deadbeef1234通过环境变量把它配置给 uv$ export UV_PUBLISH_TOKENpypi-wubalubadubdub-deadbeef1234 // 不会有任何输出但已经配置完成发布到 PyPI执行发布$ uv publish Publishing 2 files https://upload.pypi.org/legacy/ Uploading rick_portal_gun-0.1.0-py3-none-any.whl (2.3KiB) Uploading rick_portal_gun-0.1.0.tar.gz (841.0B)去 PyPI 的https://pypi.org/manage/projects/就能看到新上传的rick-portal-gun包。从 PyPI 安装验证打开另一个终端先卸载当前安装的版本$ uv tool uninstall rick-portal-gun再只凭包名安装让 uv 从 PyPI 拉取$ uv tool install rick-portal-gun测试从 PyPI 新装的包$ rick-portal-gun load // 成功 Loading portal gun用typer命令自动生成文档Typer 自带的typerCLI 可以为你的包生成 Markdown 文档直接写进 README$ typer rick_portal_gun.main utils docs --output README.md --name rick-portal-gun Docs saved to: README.md只需传入要导入的模块rick_portal_gun.main它会自动识别其中的typer.Typer应用。指定--name后生成的文档会使用该程序名。从源码看这一命令由 typer/cli.py 中的utils_app命令实现get_typer_from_state()负责导入模块并定位 Typer 对象依次尝试--app指定的对象、--func指定的函数、默认名app/cli/main以及模块内任意 Typer 实例见 typer/cli.py随后 get_docs_for_click 递归遍历命令树生成包含 Usage、Arguments、Options、Commands 等章节的 Markdown。携带文档发布新版本发布带新文档的版本前先提升pyproject.toml中的版本号[project] name rick-portal-gun version 0.2.0 description Add your description here readme README.md authors [Rick Sanchez rickexample.com] requires-python 3.14 dependencies [ typer0.21.0, ] [project.scripts] rick-portal-gun rick_portal_gun.main:app [build-system] requires [uv_build0.8.14,0.9.0] build-backend uv_build然后重新构建并发布$ uv build $ uv publish Publishing 2 files https://upload.pypi.org/legacy/ Uploading rick_portal_gun-0.2.0-py3-none-any.whl (2.3KiB) Uploading rick_portal_gun-0.2.0.tar.gz (840.0B)【免费下载链接】typerTyper, build great CLIs. Easy to code. Based on Python type hints.项目地址: https://gitcode.com/GitHub_Trending/ty/typer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表