成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

2021 年發布 Python 軟件包的正確姿勢

開發 后端
如果您像我一樣,偶爾編寫一個有用的python實用小程序,并希望與您的同事共享。做到這一點的最好方法是制作一個Python軟件包:它易于安裝,并且可以避免進行拷貝操作。

 [[394524]]

本文轉載自微信公眾號「Python中文社區」,作者Anton  。轉載本文請聯系Python中文社區公眾號。  

如果您像我一樣,偶爾編寫一個有用的python實用小程序,并希望與您的同事共享。做到這一點的最好方法是制作一個Python軟件包:它易于安裝,并且可以避免進行拷貝操作。

您可能會認為創建軟件包很麻煩。其實現在已經不會這樣了。我將通過此分步指南進行說明。只需執行三個主要步驟(以及一系列可選步驟),并輔以幾個GitHub鏈接即可。

1.初始化

我們將創建podsearch - 一種在iTunes中搜索播客的實用程序。讓我們創建一個目錄和一個虛擬環境:

  1. $ mkdir podsearch 
  2. $ cd podsearch 
  3. $ python3 -m venv env 
  4. $ . env/bin/activate 

定義一個最小的包結構:

  1. ├── .gitignore 
  2. └── podsearch 
  3.     └── __init__.py 
  4. """Let's find some podcasts!""" 
  5.  
  6.  __version__ = "0.1.0" 
  7.  
  8.  
  9.  def search(namecount=5): 
  10.      """Search podcast by name.""" 
  11.      raise NotImplementedError() 

2.測試包

用Python創建一個包曾經是一個麻煩的任務。幸運的是,如今有一個很棒的 flit (https://flit.readthedocs.io/en/latest/)小程序可以簡化所有操作。讓我們安裝它:

  1. pip install flit 

并創建軟件包描述:

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

pyproject.toml

Flit已創建pyproject.toml - 項目元數據文件。它已經具有將程序包發布到公共存儲庫-PyPI所需的一切。

注冊TestPyPi(測試存儲庫)和PyPI(主要存儲庫)。它們是完全獨立的,因此您將需要兩個帳戶。

在~/ .pypirc中設置對存儲庫的訪問權限:

  1. [distutils] 
  2. index-servers = 
  3.   pypi 
  4.   pypitest 
  5.  
  6. [pypi] 
  7. username: nalgeon  # replace with your PyPI username 
  8.  
  9. [pypitest] 
  10. repository: https://test.pypi.org/legacy/ 
  11. username: nalgeon  # replace with your TestPyPI username 

并將軟件包發布到測試存儲庫:

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

完畢!該軟件包可在TestPyPi上獲得。

3.公開軟件包

讓我們改進代碼,以便它能夠實際搜索播客:

  1. # ... 
  2.  
  3. SEARCH_URL = "https://itunes.apple.com/search" 
  4.  
  5. @dataclass 
  6. class Podcast: 
  7.     """Podcast metadata.""" 
  8.  
  9.     id: str 
  10.     name: str 
  11.     author: str 
  12.     url: str 
  13.     feed: Optional[str] = None 
  14.     category: Optional[str] = None 
  15.     image: Optional[str] = None 
  16.  
  17.  
  18. def search(name: str, limit: int = 5) -> List[Podcast]: 
  19.     """Search podcast by name.""" 
  20.     params = {"term"name"limit": limit, "media""podcast"
  21.     response = _get(url=SEARCH_URL, params=params) 
  22.     return _parse(response) 

并發布到主存儲庫-PyPI。僅在您的程序包中包含有用的代碼后,才執行此步驟。不要發布無效的程序包和存根。

  1. flit publish 

發布完畢!是時候與同事分享了。為了使軟件包易于使用,我建議您再執行以下幾個步驟。

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

沒人喜歡寫文檔。但是,如果沒有文檔,人們不太可能會想要安裝您的軟件包,因此我們需要添加README.md和CHANGELOG.md。

  • README.md
  • CHANGELOG.md

將README添加到pyproject.toml,以便PyPI在軟件包頁面上顯示它:

  1. description-file = "README.md" 

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

  1. requires-python = ">=3.7" 

更新__init__.py中的版本,并通過flit publish發布軟件包:

B.Linters和tests

我們來考慮一下格式設置(black),測試覆蓋率(coverage),代碼質量(flake8,pylint,mccabe)和靜態分析(mypy)。我們將通過tox處理一切。

  1. $ pip install black coverage flake8 mccabe mypy pylint pytest tox 

在tox.ini中創建tox配置:

  1. [tox] 
  2. isolated_build = True 
  3. envlist = py37,py38,py39 
  4.  
  5. [testenv] 
  6. deps = 
  7.     black 
  8.     coverage 
  9.     flake8 
  10.     mccabe 
  11.     mypy 
  12.     pylint 
  13.     pytest 
  14. commands = 
  15.     black podsearch 
  16.     flake8 podsearch 
  17.     pylint podsearch 
  18.     mypy podsearch 
  19.     coverage erase 
  20.     coverage run --include=podsearch/* -m pytest -ra 
  21.     coverage report -m 

tox.ini

并運行所有檢查:

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

linters檢測通過,測試也通過了,覆蓋率是100%。

C.云構建

每個可靠的開源項目在每次提交后都會進行云測試,因此我們也將這樣做。一個很好的附加效果是自述文件中有漂亮的徽章。

讓我們使用GitHub Actions構建項目,使用Codecov檢查測試覆蓋率,并使用Code Climate檢查代碼質量。

您將必須注冊Codecov和Code Climate(均支持GitHub登錄)并在設置中啟用軟件包存儲庫。

之后,將GitHub Actions構建配置添加到.github / workflows / build.yml:

  1. # ... 
  2. jobs: 
  3.     build: 
  4.         runs-on: ubuntu-latest 
  5.         strategy: 
  6.             matrix: 
  7.                 python-version: [3.7, 3.8, 3.9] 
  8.  
  9.         env: 
  10.             USING_COVERAGE: "3.9" 
  11.  
  12.         steps: 
  13.             - name: Checkout sources 
  14.               uses: actions/checkout@v2 
  15.  
  16.             - nameSet up Python 
  17.               uses: actions/setup-python@v2 
  18.               with
  19.                   python-version: $ 
  20.  
  21.             - name: Install dependencies 
  22.               run: | 
  23.                   python -m pip install --upgrade pip 
  24.                   python -m pip install black coverage flake8 flit mccabe mypy pylint pytest tox tox-gh-actions 
  25.  
  26.             - name: Run tox 
  27.               run: | 
  28.                   python -m tox 
  29.  
  30.             - name: Upload coverage to Codecov 
  31.               uses: codecov/codecov-action@v1 
  32.               if: contains(env.USING_COVERAGE, matrix.python-version) 
  33.               with
  34.                   fail_ci_if_error: true 

build.yml

就像我們前面一樣,GitHub通過tox進行測試。tox-gh-actions軟件包和USING_COVERAGE設置可確保tox使用與strategy.matrix所需的 GitHub Actions 相同的 Python 版本。

最后一步將測試覆蓋率發送給Codecov。Code Climate不需要單獨的步驟-它會自動發現存儲庫更改。

現在,一分鐘內提交,推送并享受結果。并且讓每個人也喜歡向README.md添加徽章:

  1. [![PyPI Version][pypi-image]][pypi-url] 
  2. [![Build Status][build-image]][build-url] 
  3. [![Code Coverage][coverage-image]][coverage-url] 
  4. [![Code Quality][quality-image]][quality-url] 
  5.  
  6. ... 
  7.  
  8. <!-- Badges --> 
  9.  
  10. [pypi-image]: https://img.shields.io/pypi/v/podsearch 
  11. [pypi-url]: https://pypi.org/project/podsearch/ 
  12. [build-image]: https://github.com/nalgeon/podsearch-py/actions/workflows/build.yml/badge.svg 
  13. [build-url]: https://github.com/nalgeon/podsearch-py/actions/workflows/build.yml 
  14. [coverage-image]: https://codecov.io/gh/nalgeon/podsearch-py/branch/main/graph/badge.svg 
  15. [coverage-url]: https://codecov.io/gh/nalgeon/podsearch-py 
  16. [quality-image]: https://api.codeclimate.com/v1/badges/3130fa0ba3b7993fbf0a/maintainability 
  17. [quality-url]: https://codeclimate.com/github/nalgeon/podsearch-py 

是不是很酷?

D.任務自動化

tox很好,但對于開發來說不是很方便。運行單個命令(例如pylint,coverage等)的速度更快。但是它們非常冗長,因此我們將一些無意義的操作進行自動化處理。

讓我們為Makefile的頻繁操作創建簡短的別名:

  1. .DEFAULT_GOAL := help 
  2. .PHONY: coverage deps help lint push test 
  3.  
  4. coverage:  ## Run tests with coverage 
  5.  coverage erase 
  6.  coverage run --include=podsearch/* -m pytest -ra 
  7.  coverage report -m 
  8.  
  9. deps:  ## Install dependencies 
  10.  pip install black coverage flake8 mccabe mypy pylint pytest tox 
  11.  
  12. lint:  ## Lint and static-check 
  13.  flake8 podsearch 
  14.  pylint podsearch 
  15.  mypy podsearch 
  16.  
  17. push:  ## Push code with tags 
  18.  git push && git push --tags 
  19.  
  20. test:  ## Run tests 
  21.  pytest -ra 

Makefile

這是我們的任務:

  1. $ make help 
  2. Usage: make [task] 
  3.  
  4. task                 help 
  5. ------               ---- 
  6. coverage             Run tests with coverage 
  7. deps                 Install dependencies 
  8. lint                 Lint and static-check 
  9. push                 Push code with tags 
  10. test                 Run tests 
  11. help                 Show help message 

為了使代碼更簡潔,請使用make調用替換原始的build.yml步驟:

  1. name: Install dependencies 
  2.   run: | 
  3.       make deps 
  4.  
  5. name: Run tox 
  6.   run: | 
  7.       make tox 

E.云發布

GitHub有能力為我們運行flit publish。讓我們創建一個單獨的工作流程:

  1. name: publish 
  2.  
  3. on
  4.     release: 
  5.         types: [created] 
  6.  
  7. jobs: 
  8.     publish: 
  9.         runs-on: ubuntu-latest 
  10.         steps: 
  11.             - name: Checkout sources 
  12.               uses: actions/checkout@v2 
  13.  
  14.             - nameSet up Python 
  15.               uses: actions/setup-python@v2 
  16.               with
  17.                   python-version: "3.9" 
  18.  
  19.             - name: Install dependencies 
  20.               run: | 
  21.                   make deps 
  22.  
  23.             - name: Publish to PyPi 
  24.               env: 
  25.                   FLIT_USERNAME: ${{ secrets.PYPI_USERNAME }} 
  26.                   FLIT_PASSWORD: ${{ secrets.PYPI_PASSWORD }} 
  27.               run: | 
  28.                   make publish 

publish.yml

在存儲庫設置(Settings > Secrets > New repository secret)中設置了PYPI_USERNAME和PYPI_PASSWORD。使用您的PyPi用戶名和密碼,甚至更好的-API令牌。

現在,一旦創建新版本,GitHub將自動發布該軟件包。

您的軟件包已準備就緒!它具有人們夢寐以求的一切:干凈的代碼,清晰的文檔,測試和云構建。是時候告訴你的同事和朋友了。

這些設置將使您的 Python 軟件包變得AWESOME:

  • pyproject.toml
  • tox.ini
  • Makefile
  • build.yml
  • publish.yml 

 

責任編輯:武曉燕 來源: Python中文社區
相關推薦

2024-01-26 12:35:25

JavaScript項目軟件包

2022-11-07 16:53:53

PipPython軟件包

2017-08-21 11:13:43

LinuxSnapcraft Snap軟件包

2019-11-26 17:29:15

Adobe

2018-06-22 10:05:04

Arch LinuxDEB軟件包

2016-02-16 13:21:33

2010-02-05 14:46:20

Ubuntu軟件包

2018-01-11 15:31:39

命令Linux關機

2020-02-24 15:26:40

Python短信免費

2011-04-30 16:56:45

Windows PhoiOS

2016-05-09 10:41:03

算法分析開發

2017-02-23 15:37:44

OptionObject容器

2017-09-14 14:30:47

LinuxSublime Tex編輯器

2010-01-07 17:32:09

2023-01-06 08:24:00

PandasPython

2019-09-25 09:20:33

機器學習Python數據科學

2017-07-10 13:09:45

前端Flexbox

2017-03-16 11:39:33

Openstack源碼姿勢

2023-01-30 07:41:43

2010-04-30 10:28:11

Unix安裝
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品久久成人 | 天堂成人国产精品一区 | 91中文在线观看 | 黄视频网址 | 亚洲免费av一区 | 超碰av在线 | 一区二区三区中文字幕 | 色综合视频 | 无码一区二区三区视频 | 欧美在线观看一区二区 | 国产精品毛片无码 | 国产一区视频在线 | 精品国产第一区二区三区 | 91中文在线观看 | 99re热精品视频国产免费 | 亚洲精品视频免费观看 | 国产精品九九视频 | 成人午夜激情 | 草在线| 成人在线精品视频 | 久久小视频 | 亚洲人成免费 | 国产精品久久久久久久久久免费看 | 天天草草草 | 免费av观看 | 91精品国产一区二区三区 | 精品国产黄色片 | 精久久久久 | 国产精品污www在线观看 | 国产精品久久久久久久久久久久久 | 国产乱人伦精品一区二区 | 久在线观看 | 精品毛片 | 亚洲高清视频在线观看 | 欧美在线一区二区三区 | 综合网伊人| 亚洲精品一区中文字幕乱码 | 久久成 | 在线观看成年人视频 | 久久久亚洲一区 | 欧美日一区 |