如果您像我一样,偶尔编写一个有用的python实用小程序,并希望与您的同事共享。做到这一点的最好方法是制作一个Python软件包:它易于安装,并且可以避免进行拷贝操作。

您可能会认为创建软件包很麻烦。其实现在已经不会这样了。我将通过此分步指南进行说明。只需执行三个主要步骤(以及一系列可选步骤),并辅以几个GitHub链接即可。

1.初始化

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

$ mkdir podsearch
$ cd podsearch
$ python3 -m venv env
$ . env/bin/activate

定义一个最小的包结构:

.
├── .gitignore
└── podsearch└── __init__.py
"""Let's find some podcasts!"""__version__ = "0.1.0"def search(name, count=5):"""Search podcast by name."""raise NotImplementedError()

2.测试包

用Python创建一个包曾经是一个麻烦的任务。幸运的是,如今有一个很棒的 flit (https://flit.readthedocs.io/en/latest/)小程序可以简化所有操作。让我们安装它:

pip install flit

并创建软件包描述:

$ flit init
Module name [podsearch]:
Author [Anton Zhiyanov]:
Author email [m@antonz.org]:
Home page [https://github.com/nalgeon/podsearch-py]:
Choose a license (see http://choosealicense.com/ for more info)
1. MIT - simple and permissive
2. Apache - explicitly grants patent rights
3. GPL - ensures that code based on this is shared with the same terms
4. Skip - choose a license later
Enter 1-4 [1]: 1Written pyproject.toml; edit that file to add optional extra info.

pyproject.toml

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

注册TestPyPi(测试存储库)和PyPI(主要存储库)。它们是完全独立的,因此您将需要两个帐户。

~/ .pypirc中设置对存储库的访问权限:

[distutils]
index-servers =pypipypitest[pypi]
username: nalgeon  # replace with your PyPI username[pypitest]
repository: https://test.pypi.org/legacy/
username: nalgeon  # replace with your TestPyPI username

并将软件包发布到测试存储库:

$ flit publish --repository pypitest
Found 4 files tracked in git
...
Package is at https://test.pypi.org/project/podsearch/

完毕!该软件包可在TestPyPi上获得。

3.公开软件包

让我们改进代码,以便它能够实际搜索播客:


# ...SEARCH_URL = "https://itunes.apple.com/search"@dataclass
class Podcast:"""Podcast metadata."""id: strname: strauthor: strurl: strfeed: Optional[str] = Nonecategory: Optional[str] = Noneimage: Optional[str] = Nonedef search(name: str, limit: int = 5) -> List[Podcast]:"""Search podcast by name."""params = {"term": name, "limit": limit, "media": "podcast"}response = _get(url=SEARCH_URL, params=params)return _parse(response)

并发布到主存储库-PyPI。仅在您的程序包中包含有用的代码后,才执行此步骤。不要发布无效的程序包和存根。

flit publish

发布完毕!是时候与同事分享了。为了使软件包易于使用,我建议您再执行以下几个步骤。

A.自述文件Readme和变更日志changelog

没人喜欢写文档。但是,如果没有文档,人们不太可能会想要安装您的软件包,因此我们需要添加README.mdCHANGELOG.md

  • README.md

  • CHANGELOG.md

将README添加到pyproject.toml,以便PyPI在软件包页面上显示它:

description-file = "README.md"

还要指定受支持的最低Python版本:

requires-python = ">=3.7"

更新__init__.py中的版本,并通过flit publish发布软件包:

B.Linterstests

我们来考虑一下格式设置(black),测试覆盖率(coverage),代码质量(flake8pylintmccabe)和静态分析(mypy)。我们将通过tox处理一切。

$ pip install black coverage flake8 mccabe mypy pylint pytest tox

tox.ini中创建tox配置:

[tox]
isolated_build = True
envlist = py37,py38,py39[testenv]
deps =blackcoverageflake8mccabemypypylintpytest
commands =black podsearchflake8 podsearchpylint podsearchmypy podsearchcoverage erasecoverage run --include=podsearch/* -m pytest -racoverage report -m

tox.ini

并运行所有检查:

$ tox -e py39
...
py39 run-test: commands[0] | black podsearch
All done!
...
py39 run-test: commands[2] | pylint podsearch
Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00)
...
py39 run-test: commands[6] | coverage report -m
TOTAL 100%
...
py39: commands succeeded
congratulations :)

linters检测通过,测试也通过了,覆盖率是100%。

C.云构建

每个可靠的开源项目在每次提交后都会进行云测试,因此我们也将这样做。一个很好的附加效果是自述文件中有漂亮的徽章。

让我们使用GitHub Actions构建项目,使用Codecov检查测试覆盖率,并使用Code Climate检查代码质量。

您将必须注册CodecovCode Climate(均支持GitHub登录)并在设置中启用软件包存储库。

之后,将GitHub Actions构建配置添加到.github / workflows / build.yml

# ...
jobs:build:runs-on: ubuntu-lateststrategy:matrix:python-version: [3.7, 3.8, 3.9]env:USING_COVERAGE: "3.9"steps:- name: Checkout sourcesuses: actions/checkout@v2- name: Set up Pythonuses: actions/setup-python@v2with:python-version: $- name: Install dependenciesrun: |python -m pip install --upgrade pippython -m pip install black coverage flake8 flit mccabe mypy pylint pytest tox tox-gh-actions- name: Run toxrun: |python -m tox- name: Upload coverage to Codecovuses: codecov/codecov-action@v1if: contains(env.USING_COVERAGE, matrix.python-version)with:fail_ci_if_error: true

build.yml

就像我们前面一样,GitHub通过tox进行测试。tox-gh-actions软件包和USING_COVERAGE设置可确保tox使用与strategy.matrix所需的 GitHub Actions 相同的 Python 版本。

最后一步将测试覆盖率发送给CodecovCode Climate不需要单独的步骤-它会自动发现存储库更改。

现在,一分钟内提交,推送并享受结果。并且让每个人也喜欢向README.md添加徽章:

[![PyPI Version][pypi-image]][pypi-url]
[![Build Status][build-image]][build-url]
[![Code Coverage][coverage-image]][coverage-url]
[![Code Quality][quality-image]][quality-url]...<!-- Badges -->[pypi-image]: https://img.shields.io/pypi/v/podsearch
[pypi-url]: https://pypi.org/project/podsearch/
[build-image]: https://github.com/nalgeon/podsearch-py/actions/workflows/build.yml/badge.svg
[build-url]: https://github.com/nalgeon/podsearch-py/actions/workflows/build.yml
[coverage-image]: https://codecov.io/gh/nalgeon/podsearch-py/branch/main/graph/badge.svg
[coverage-url]: https://codecov.io/gh/nalgeon/podsearch-py
[quality-image]: https://api.codeclimate.com/v1/badges/3130fa0ba3b7993fbf0a/maintainability
[quality-url]: https://codeclimate.com/github/nalgeon/podsearch-py

是不是很酷?

D.任务自动化

tox很好,但对于开发来说不是很方便。运行单个命令(例如pylintcoverage等)的速度更快。但是它们非常冗长,因此我们将一些无意义的操作进行自动化处理。

让我们为Makefile的频繁操作创建简短的别名:

.DEFAULT_GOAL := help
.PHONY: coverage deps help lint push testcoverage:  ## Run tests with coveragecoverage erasecoverage run --include=podsearch/* -m pytest -racoverage report -mdeps:  ## Install dependenciespip install black coverage flake8 mccabe mypy pylint pytest toxlint:  ## Lint and static-checkflake8 podsearchpylint podsearchmypy podsearchpush:  ## Push code with tagsgit push && git push --tagstest:  ## Run testspytest -ra

Makefile

这是我们的任务:


$ make help
Usage: make [task]task                 help
------               ----
coverage             Run tests with coverage
deps                 Install dependencies
lint                 Lint and static-check
push                 Push code with tags
test                 Run tests
help                 Show help message

为了使代码更简洁,请使用make调用替换原始的build.yml步骤:

- name: Install dependenciesrun: |make deps- name: Run toxrun: |make tox

E.云发布

GitHub有能力为我们运行flit publish。让我们创建一个单独的工作流程:

name: publishon:release:types: [created]jobs:publish:runs-on: ubuntu-lateststeps:- name: Checkout sourcesuses: actions/checkout@v2- name: Set up Pythonuses: actions/setup-python@v2with:python-version: "3.9"- name: Install dependenciesrun: |make deps- name: Publish to PyPienv:FLIT_USERNAME: ${{ secrets.PYPI_USERNAME }}FLIT_PASSWORD: ${{ secrets.PYPI_PASSWORD }}run: |make publish

publish.yml

在存储库设置(Settings > Secrets > New repository secret)中设置了PYPI_USERNAMEPYPI_PASSWORD。使用您的PyPi用户名和密码,甚至更好的-API令牌。

现在,一旦创建新版本,GitHub将自动发布该软件包。

您的软件包已准备就绪!它具有人们梦寐以求的一切:干净的代码,清晰的文档,测试和云构建。是时候告诉你的同事和朋友了。

这些设置将使您的 Python 软件包变得AWESOME:

  • pyproject.toml

  • tox.ini

  • Makefile

  • build.yml

  • publish.yml

更多阅读

5 分钟快速上手 pytest 测试框架

5分钟掌握 Python 随机爬山算法

5分钟快速掌握 Adam 优化算法

特别推荐

点击下方阅读原文加入社区会员

2021 年发布 Python 软件包的正确姿势!相关推荐

  1. 如何自学python数据分析-良心整理!学习Python数据分析的正确姿势

    学习 Python 数据分析的正确姿势 如果你是通过学习给程序员设计的 Python 课程来学习 Python 数据分析,那就大错特错了.很多数据分析师在开始学习 Python 数据分析之前就被引导学 ...

  2. python语言自学-零基础小白学习Python编程语言的正确姿势(纯干货)

    原标题:零基础小白学习Python编程语言的正确姿势(纯干货) 敢问有哪种编程语言集简洁.优雅.简单.全能于一身?Python绝对算的上是一个.举个例子,比如完成同一个任务,C语言需要写1000行代码 ...

  3. python人工智能入门优达视频_机器学习:优达教你搭建Python 环境的正确姿势

    原标题:机器学习:优达教你搭建Python 环境的正确姿势 为机器学习搭建好 Python 环境听起来简单,但有时候坑还不少.如果此前没有配置过类似的环境,很可能会苦苦折腾各种命令好几个小时.可是我明 ...

  4. 常用jar包_发布Maven包的正确姿势

    本文介绍如何把自己写的Maven包发布到公开仓库/中央仓库/私有仓库. 当我们使用commons-logging这些第三方开源库的时候,我们实际上是通过Maven自动下载它的jar包,并根据其pom. ...

  5. 关于使用 Python 析构函数的正确姿势

    女主宣言 python在大家的印象中,没有专用的构造和析构函数.但是,从现在开始,作者将带领大家熟悉python中的__init__和__del__函数,以替代构造和析构机制. PS:丰富的一线技术. ...

  6. 发布nuget包的正确姿势---cicd自动打包发布

    最轻便的发布nuget包方式,方便cicd自动打包发布nuget包 首先新建项目 项目名随便取,这里就叫它GuiH.ClassLibrary 默认即可,需要改目标版本时,等创建好再改 项目创建好了 随 ...

  7. python人工智能入门优达视频_python入门视频教你搭建机器学习Python环境的正确姿势...

    为机器学习搭建好Python环境听起来简单,但有时候坑还不少.如果此前没有配置过类似的环境,很可能会苦苦折腾各种命令好几个小时.可是我明明只是想马上搞起来我的机器学习! 在优达学城(Udacity)此 ...

  8. 学习python的正确姿势——

    python作为编程语言中极具发展潜力的一种,已经被越多越多的应用在各个场景下,那么如何学习python就成了大家都关心的问题.事实上,python的学习并不困难,难的是坚持去学习,通过系统的梳理知识 ...

  9. python 软件包_以正确的方式管理Python软件包

    python 软件包 Python包索引(PyPI)索引了一系列令人惊奇的库和应用程序,涵盖了所有可以想象的用例. 但是,在安装和使用这些软件包时,新手经常会发现自己遇到了以下问题:缺少权限,不兼容的 ...

最新文章

  1. DIV与SPAN之间有什么区别
  2. ubuntu下wget下载Linux内核源码、make生成.config文件
  3. iOS 提交审核注意事项
  4. SQL Server 移动数据库
  5. arm7 mysql 编译安装_uboot的readme导读(转)
  6. redis配置文件讲解
  7. 钉钉设置jira机器人_这是当您机器学习JIRA票证时发生的事情
  8. 【java机器学习】决策树算法
  9. javascript Array学习与使用
  10. pclose与fclose的区别
  11. JDK动态代理为什么必须要基于接口
  12. Dorado 7 使用到的 注释
  13. cocos2dx3.17-lua的csb文件使用方法
  14. 战神引擎修改文件的位置
  15. 腾讯云函数免费搭建onedrive网盘
  16. 成都待慕电商:抖音极速版商品卡免佣扶持政策规则
  17. GridView控件 Image控件 与图片的二进制数据库存储和显示
  18. 【数据可视化】复杂高维多元数据的可视化
  19. Docker系列:docker 容器命令: 删除 停止 启动 重启
  20. grbl源码解析——速度前瞻(1)

热门文章

  1. 小米手机的刷机经验教训
  2. 安卓机器人做图软件_美图秀秀绘画机器人app下载-美图绘画机器人Andy最新版下载v7.0.0.0-西西软件下载...
  3. python 实现四则运算(一)
  4. 回顾 | Teams + Power Platform低代码数字化技术融合趋势
  5. 论文阅读——Image Inpainting for Irregular Holes Using Partial Convolutions
  6. 高通平台 lcd driver 调试小结
  7. python绘制曲线图
  8. 【商城开发三】Android 仿淘宝商品详情页下拉足迹修改版
  9. 量子计算机 最先进国家,中国获得量子霸权,玻色取样取得重大成功,成为当今量子技术最先进的国家。...
  10. 数据分析三剑客之数据加载(四)