如何在2021年制作一个Python包

2021-04-08 10:12:08

如果您喜欢我,每次偶尔都会写一个有用的Python实用程序,并希望与同事分享它。这样做的最佳方法是制作一个包:易于安装并从复印粘贴中保存。

如果你像我一样,你可能会认为创建包是一个真正的头痛。好吧,这不是这种情况。我将通过这个逐步的指南来证明它。只有三个主要步骤(以及一堆可选的步骤)伴随着几个GitHub链接。你自己看:

我们将创建Podsearch - 一个实用程序,用于搜索iTunes中的播客。让我们创建一个目录和虚拟环境:

"""找到一些播客!""" __version__ =" 0.1.0" def搜索(名称,count = 5):"""按名称搜索播客。"""提升NotimplementedError()

在Python中创建一个包曾经是一个麻烦的任务。幸运的是,如今有一个很大的小碎片实用程序,简化了一切。让我们安装它:

$ flit initmodule name [podsearch]:author [anton zhiyanov]:作者电子邮件[[email protected]]:主页[https://github.com/nalgeon/podsearch-py:schoose一个许可证(请参阅http:/ /choosealicense.com/获取更多信息)1。麻省理工学院 - 简单和杂散2。 Apache - 明确授予专利权3。 GPL - 确保基于此的代码与相同的条款4共享。跳过 - 选择License WelderEnter 1-4 [1]:1写pyproject.toml;编辑该文件以添加可选的额外信息。

Flit已创建pyproject.toml - 项目元数据文件。它已经拥有将包发布到公共存储库 - PYPI所需的一切。

注册TestPypi(测试存储库)和PYPI(主要是一个)。它们是完全独立的,所以你需要两个帐户。

[stortutils]索引服务器= pypi pypitest [pypi]用户名:nalgeon#用您的Pypi用户名[PypiTest]存储库:https://test.pypi.org/legacy/username:nalgeon#reply与您的testpypi用户名替换

#...搜索_url =" https://itunes.apple.com/search" @ dataclass类播客:"""播客元数据。""" ID:str名称:str作者:str URL:str effer:可选[str] =无类别:可选[str] =无图像:可选[str] = none def搜索(名称:str,limit:int = 5) - >列表[播客]:"""按名称搜索播客。""" params = {"术语" :姓名,"限制" :限制,"媒体" :"播客" }响应= _get(url = search_url,params = params)返回_parse(响应)

并发布到主存储库 - PYPI。仅在您的包具有有用的工作代码后才执行此步骤。不要发布非工作包和存根。

要使包装愉快使用,我建议您遵循更多步骤。

没有人喜欢写文档。但没有文档,人们不太可能想要安装包,所以让我们添加Readme.md和changelog.md。

让我们照顾格式(黑色),测试覆盖范围(覆盖范围),代码质量(Flake8,Pylint,McCabe)和静态分析(Mypy)。我们将通过TOX运行一切。

[tox]孤立的_build = tighenvlist = py37,py37,py38,py39 [testenv] deps =黑色覆盖范围=黑色覆盖率flake8 mccabe mype pylint pytestcommands =黑色podsearch flake8 podsearch pylint podsearch mype podsearch覆盖擦除覆盖覆盖运行--include = podsearch / * -m pytest -ra覆盖范围报告-M.

$ tox -e py39 ... py39 run-test:命令[0] | Black Podsearchall完成! ✨🍰✨... py39 run-test:命令[2] | Pylint Podsearchyour代码已被评为10.00 / 10(以前的运行:10.00 / 10,+0.00)... py39 run-test:命令[6] | Coverage Report -Mtotal 100%... py39:命令成功概念:)

每次提交后,每个固体开源项目都会运行云测试,所以我们也会运行。一个漂亮的副作用是在自述文件中有美丽的徽章

让我们用github动作构建项目,检查用CodeCov和代码质量的测试覆盖,代码气候。

您必须注册Codecov和Code Climate(支持GitHub登录)并在设置中启用包存储库。

#...工作:构建:runs-on:ubuntu-最新策略:矩阵:python-version:[3.7,3.8,3.9] env:使用_coverage:" 3.9"步骤: - 姓名:结帐源使用:操作/ checkout @ v2 - 名称:设置python使用:操作/ setup-python @ v2 with:python-version:$ - name:安装依赖项运行:| Python -M pip安装 - upgrade pip python-m pip安装黑色覆盖率flake8 flites mccabe mypy pylint pytest tox tox-gh-action - name:运行tox运行:| Python -M Tox - 名称:上传CodeCov使用:CodeCov / CodeCov-Action @ V1 IF:包含(env.using_coverage,matrix.python-version)with:fail_ci_if_error:true

github通过tox运行测试 - 就像我们所做的那样。 Tox-GH-Actions Package和使用_Coverage设置确保Tox使用与Transtratem.Matrix(我学习来自Hynek Schlawak)的聪明伎俩)作为GitHub操作的相同Python版本。

最后一步向Codecov发送测试覆盖范围。代码气候不需要单独的步骤 - 它斑点存储库自动更改。

现在提交,推,享受一分钟的结果。让每个人都喜欢享受 - 为Readme.md添加徽章:

[![PYPI版本] [PYPI-IMAGE]] [PYPI-URL] [![构建状态] [构建图像]] [构建 - url] [![代码覆盖] [coverage-image]] [coverage-url ] [![代码质量] [质量图像]] [质量 - url] ...<! - 徽章 - > [PYPI-IMAGE]:https://img.shields.io/pypi/v/podsearch [pypi-url]:https://pypi.org/project/podsearch/ [build-image]:https:// github .com / nalgeon / podsearch-py /操作/ workflows / build.yml / badge.svg [build-url]:https://github.com/nalgeon/podsearch-py/actions/workflows/build.yml [coverage-图像]:https://codecov.io/gh/nalgeon/podsearch-py/branch/main/graph/badge.svg [coverage-url]:https://codecov.io/gh/nalgeon/podsearch-py [质量形象]:https://api.codeClimate.com/v1/badges/3130fa0ba3b7993fbf0a/maintainability [质量url]:https://codeclimate.com/github/nalgeon/podsearch-py

TOX很好,但不能很方便开发。运行Pylint,覆盖范围等的个别命令更快,但它们非常冗长,因此我们将自动化无聊的东西。

.default_Goal:= Help.Phony:Coverage Deps帮助Lint Push TestCoverage:##使用Coverage Coverage删除测试删除覆盖范围--include = Podsearch / * -M PyTest -RA Coverage报告-mdeps:##安装依赖性PIP安装黑色覆盖Flake8 McCabe Mypy Pylint Pytest Toxlint:## Lint和Static-Check Flake8 Podsearch Pylint Podsearch MyPy Podsearchpush:##推送代码标签Git Push&& git push --tagstest:##运行测试pytest -ra

$ Make Helpus:使[任务]任务帮助------ ----覆盖Rockededeps安装依赖性leventiesLint Lint和Static-Checkpush推送代码与tagstest运行testshelp show help消息

- 名称:安装依赖项运行:| make deps - name:运行tox运行:|制作毒素

GitHub很有能力为我们运行Flit发布。让我们创建一个单独的工作流程:

名称:发布ON:发布:类型:[已创建]作业:发布:运行:Ubuntu-最新步骤: - 名称:Checkout源使用:操作/ checkout @ v2 - 名称:设置python使用:操作/ setup-python @ v2带:python-version:" 3.9" - 名称:安装依赖项运行:| make deps - 名称:发布到pypi env:flit_username:$ {{secets.pypi_username}} flit_password:$ {{secet.pypi_password}}运行:|发布

pypi_username和pypi_password设置在存储库设置(设置>秘密>新存储库秘密)中。使用您的PYPI用户名和密码,甚至更好 - API令牌。

现在GitHub会在创建新版本后立即自动发布包裹。甜的!

你的完美包装已准备好!它有一切可以梦想:清洁代码,清晰的文档,测试和云构建。是时候告诉你的同事和朋友了。