写个python包-pyscaffold的使用

Scaffold

Scaffold是一个比较通用的 Python 包构建体系工具,其通过和其他一些包共同完成 Python 包的建立、安装、分发和后续的持久维护工作。

Scaffold包主要负责的工作是将很多 Python 项目的工具整合起来,减少重复性工作。其可通过pip安装:

1
pip install pyscaffold

记录一些我们遵循的惯例和标准

Python(包)项目的目录结构

https://blog.ionelmc.ro/2014/05/25/python-packaging/#the-structure

├─ src
│  └─ packagename
│     ├─ __init__.py
│     └─ ...
├─ tests
│  └─ ...
└─ setup.py

Scaffold 的基本使用过程

当安装好 pyscaffold 后,通常一些命令就已经加入系统的环境变量中,可以直接使用,如果不能,应当确认相关的项是否已经可用。

在准备之前,均应当安装好相关的环境,建议使用conda安装和配置环境。

1
2
conda env create -n ${condeEnvName} python=3.7
conda install -c conda-forge pyscaffold

Scaffold 创建一个项目

  1. 在${my_project}目录下创建一个 Python 项目
1
putup ${my_project}

更详细的创建可参照https://pyscaffold.org/en/stable/examples.html

Scaffold会使项目的目录成为以下结构:
├─ AUTHORS.rst
├─ LICENSE.txt
├─ docs
├─ setup.cfg
├─ src
│ ├─ init.py
│ └─ …
├─ CHANGELOG.rst
├─ README.rst
├─ requirements.txt
├─ setup.py
└─ tests 2. 配置项目和写代码、测试
项目通过setup.cfg文件进行项目名、作者、协议、依赖等的配置,必要时可撰写修改 README.rst

一些功能的实现

不定期更新

命令行调用

setup.cfg中修改[options.entry_points]的配置,格式如下:

1
2
console_scripts =
fibonacci = fullerenedatapraser.skeleton:run

pytest 写单元测试

配置好 pyscaffold 后直接使用test文件夹下的文件写即可,格式参照:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import pytest

# Import Some packages
import os

def test_XXX():
"""XXX Tests"""
assert XXX(1) == 1
assert XXX(2) == 1
assert XXX(7) == 13
with pytest.raises(AssertionError):
XXX(-10)


def test_main(capsys):
"""CLI Tests"""
# capsys is a pytest fixture that allows asserts agains stdout/stderr
# https://docs.pytest.org/en/stable/capture.html
main(["7"])
captured = capsys.readouterr()
assert "The 7-th Fibonacci number is 13" in captured.out


def test_OTHERS():
pass


注:pytest 可以在不同的函数、包中发现用例,发现的规则如下

  • 文件名以 test_开头的 py 文件
  • 以 test_开头的函数
  • 以 Test 开头的类
  • 以 test_开头的方法(与 2 类似)
  • 要注意的是所有的包必须要有 init.py 文件(在使用各种编辑器时会自动生成)

使用前需要安装pytest-cov。