python_package_release.md 4.8 KB
Newer Older
J
Jackwaterveg 已提交
1 2 3 4
# 简化安装与发包

## 问题:

J
Jackwaterveg 已提交
5
1. [如何去除 ubuntu 的 apt 安装依赖?](#conda-代替系统依赖)
J
Jackwaterveg 已提交
6
2. [如何支持普通用户和开发者两种安装的需求,尽量减少普通用户所需的依赖?](#区分install模式和develop模式)
J
Jackwaterveg 已提交
7 8
3. [如何进行 python 包的动态安装?](#python-包的动态安装)
4. [如何进行 python 项目编包?](#python-编包方法)
J
Jackwaterveg 已提交
9
5. [发包前要有什么准备?](#关于发包前的准备工作)
J
Jackwaterveg 已提交
10
6. [发 C++ 包需要注意的东西?](#manylinux)
11 12 13 14 15



## conda 代替系统依赖

小湉湉's avatar
小湉湉 已提交
16
conda 可以用来代替一些 apt-get 安装的系统依赖,这样可以让项目适用于除了 ubuntu 以外的系统。
17

小湉湉's avatar
小湉湉 已提交
18
使用 conda 可以安装 sox, libsndfile,swig 等 paddlespeech 需要的依赖:
19 20 21 22 23

```bash
conda install -y -c conda-forge sox libsndfile
```

小湉湉's avatar
小湉湉 已提交
24
部分系统会缺少 libbzip2 库,这个 paddlespeech 也是需要的,这也可以用 conda 安装:
25 26 27 28 29

```bash
conda install -y -c bzip2
```

小湉湉's avatar
小湉湉 已提交
30
conda 也可以安装 linux 的 C++ 的依赖:
31 32 33 34 35

```bash
conda install -y -c gcc_linux-64=8.4.0 gxx_linux-64=8.4.0
```

小湉湉's avatar
小湉湉 已提交
36
#### 剩余问题:使用 conda 环境编译 kenlm 失败。目前在 conda 环境下编译 kenlm 会出现链接失败的问题
37 38 39 40 41 42 43

目前知道需要的依赖:

```bash
conda install -c conda-forge eigen boost cmake
```

J
Jackwaterveg 已提交
44 45
## 区分install模式和develop模式

小湉湉's avatar
小湉湉 已提交
46
可以在 setup.py 中划分 install 的依赖(基本依赖)和 develop 的依赖 (开发者额外依赖)。 setup_info 中 `install_requires` 设置 install 的依赖,而在 `extras_require` 中设置 `develop` key 为 develop 的依赖。
J
Jackwaterveg 已提交
47 48 49 50 51 52 53 54 55 56 57 58
普通安装可以使用:

```bash
pip install . 
```

另外使用 pip 安装已发的包也是使用普通安装的:

```
pip install paddlespeech
```

小湉湉's avatar
小湉湉 已提交
59
而开发者可以使用如下方式安装,这样不仅会安装 install 的依赖,也会安装 develop 的依赖, 即:最后安装的依赖 = install 依赖 + develop 依赖:
J
Jackwaterveg 已提交
60 61 62 63 64 65 66

```bash
pip install -e .[develop]
```

## python 包的动态安装

小湉湉's avatar
小湉湉 已提交
67
可以使用 pip 包来实现动态安装:
J
Jackwaterveg 已提交
68 69 70 71 72 73 74 75 76 77

```python
import pip
if int(pip.__version__.split('.')[0]) > 9:
        from pip._internal import main
    else:
        from pip import main
    main(['install', package_name])
```

78 79 80 81 82 83 84 85 86 87 88 89 90 91
## python 编包方法

#### 创建 pypi的账号

创建 pypi 账号

#### 下载 twine

```
pip install twine
```

#### python 编包

小湉湉's avatar
小湉湉 已提交
92
编写好 python 包的 setup.py, 然后使用如下命令编 wheel 包:
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109

```bash
python setup.py bdist_wheel
```

如果要编源码包,用如下命令:

```bash
python setup.py sdist
```

#### 上传包

```bash
twine upload dist/wheel包
```

小湉湉's avatar
小湉湉 已提交
110
输入账号和密码后就可以上传 wheel 包了
111 112 113 114 115 116

#### 关于python 包的发包信息

主要可以参考这个[文档](https://packaging.python.org/en/latest/guides/distributing-packages-using-setuptools/?highlight=find_packages)


J
Jackwaterveg 已提交
117 118 119
## 关于发包前的准备工作

#### 拉分支
小湉湉's avatar
小湉湉 已提交
120
在发包之前需要拉分支。例如需要发 0.1.0 版本的正式包,则需要拉一个 r0.1 的分支。并且在这个 r0.1 分支的包上面打 0.1.0 的tag。在拉分支之前可以选择性的使用 rc 版本发一个正式版前的试用包,例如0.1.0rc0,等到rc包测试通过后,再拉分支(如果是发 0.1.1 包,则 merge r0.1分支),打tag,完成发包。总体步骤可以总结为:
J
Jackwaterveg 已提交
121

J
Jackwaterveg 已提交
122 123 124
- 用 develop 分支发 rc 包
- rc 包通过后拉分支
- 打 tag
J
Jackwaterveg 已提交
125
- 发包
J
Jackwaterveg 已提交
126
- 编写 release note
J
Jackwaterveg 已提交
127 128 129 130



## ManyLinux
131

J
Jackwaterveg 已提交
132
为了让有 C++ 依赖的 pip wheel 包可以适用于更多的 linux 系统,需要降低其本身的 glibc 的依赖。这就需要让 pip wheel 包在 manylinux 的 docker 下编包。关于查看系统的 glibc 版本,可以使用命令:`ldd --version`
133 134 135

### Manylinux

J
Jackwaterveg 已提交
136
关于 Manylinux,主要可以参考 Github 项目的说明[ github many linux](https://github.com/pypa/manylinux)
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
manylinux1 支持 Centos5以上, manylinux2010 支持 Centos 6 以上,manylinux2014 支持Centos 7 以上。
目前使用 manylinux2010 基本可以满足所有的 linux 生产环境需求。(不建议使用manylinux1,系统较老,难度较大)

### 拉取 manylinux2010

```bash
docker pull quay.io/pypa/manylinux1_x86_64
```

### 使用 manylinux2010

启动 manylinux2010 docker。

```bash
docker run -it xxxxxx
```

J
Jackwaterveg 已提交
154
在 manylinux2010 的docker环境自带 swig 和各种类型的 python 版本。这里注意不要自己下载 conda 来安装环境来编译 pip 包,要用 docker 本身的环境来编包。
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
设置python:

```bash
export PATH="/opt/python/cp37-cp37m/bin/:$PATH"
#export PATH="/opt/python/cp38-cp38/bin/:$PATH"
#export PATH="/opt/python/cp39-cp39/bin/:$PATH"
```

随后正常编包,编包后需要使用 [auditwheel](https://github.com/pypa/auditwheel) 来降低编好的wheel包的版本。
显示 wheel 包的 glibc 依赖版本

```bash
auditwheel show wheel包
```

降低 wheel包的版本

```bash
auditwheel repair wheel包
```