1. 为什么要打包
先不说要构建什么大项目,在平时数据分析过程中,我们往往会涉及到写一些小脚本,但很不利于维护管理,重复使用以及与同事交流。通过打包封装,然后发布就可以让这些方便起来。而且我觉得这是一个相对宏观的知识。有了一些基础后了解这些宏观的东西反而可以让自己在平时的搬砖中更加清楚。起码碰到bug
时会更加快捷地解决。
cat /etc/issue
python --version
## Ubuntu 18.04.4 LTS \n \l
##
## Python 3.6.8
当然这是属于开发工作,是有别于数据分析的。首先,要尽量让自己的开发环境保持干净。所以用virtualenv
来构建是这样的环境是很合适的。这样的开发环境构建可以参考《拒绝conda, 用virtualenv构建多版本的python开发环境》。当然你也可以选pipenv
。我所用的开发系统为WSL
, 编辑器为vim
。配置可以参考《工欲善其事必先利其器--开发者利器vim插件篇》
★写包不等于可以发文章,写文章发文章是另外操作。但是,如果开发的包能够解决某些痛点问题,那还是比较有意义的。
”
2. 前期基础
首先,你要会一些基础的python
语法,知道用pip
,python setup.py install
来安装。
3. 总体流程
这里介绍的打包方式是比较常见的。后面是可以发布到pypi
上,然后用户可以通过pip
或者python setup.py install
来安装。
一个项目的开始,首先都是基于想解决什么问题,有什么意义。意义有大有小。这部分是属于更上层的东西,没办法具体说出来,只能根据个人工作内容经历,思维,眼光等等来了。这里介绍的是适用于刚好有一些脚本,然后想封装的人。因为我之前也是写一个个脚本,后面花了点时间把一些脚本封装写了BioFtParse
包。所以这里主要还是基于这个包来说。
3.1 总体结构
这里的BioFtParse
为我的项目仓库名,在Linux
下用tree
查看该仓库下的文件结构。
tree BioFtParse
## BioFtParse
## ├── BioFtParse
## │ ├── genbank.py
## │ ├── __init__.py
## │ ├── parse_genbank.py
## │ └── _version.py
## ├── LICENSE.txt
## ├── Makefile
## ├── MANIFEST.in
## ├── README.md
## └── setup.py
##
## 1 directory, 9 files
可以发现BioFtParse
仓库下还有一个BioFtParse
文件夹,其实这个就是包名,里面含有的.py
就是代码了,有些包还有submodule
,这种时候就会在改包名的文件夹下再建子文件然后再来存代码。平时看到的from matplotlib.axes import XXX
这里的axes
就是一个submodule
, 而XXX
就存在这个submodule
的文件夹下。这部分基本就是所有代码的存放位置。
3.2 配置setup.py
R
包的封装基本就是靠DESCRPTION
文件来配置。而python
则由setup.py
来完成。
cat BioFtParse/setup.py
## import sys
## from setuptools import setup, find_packages
## from BioFtParse import __version__
##
## requirements = ["Bio", "pandas", "argparse"]
##
##
## setup(
## name='BioFtParse',
## author='xu shuangbin',
## author_email='xshuangbin@163.com',
## version=__version__,
## url='http://github.com/xiangpin/',
## description='Multiple Bioinformatics format files parse toolkits',
## license='Apache 2.0',
## packages=find_packages(),
## python_requires='>3.0.0',
## install_requires=requirements,
## entry_points={
## 'console_scripts': [
## 'parse_genbank.py=BioFtParse.parse_genbank:main'
## ],
## },
## classifiers=[
## 'Environment :: Console',
## 'Development Status :: 3 - Alpha',
## 'License :: OSI Approved :: Apache Software License',
## 'Programming Language :: Python :: 3'
## ],
## )
前面的import
就是来导入相应包的函数或者类。这块其实就是setuptools
包的使用,如果你想更详细了解,看它给的官方文档是最好的。这里我只讲setup
这个函数,因为基本够了。这个函数中的name
参数是必需的,就是这个包的名字;author
与author_email
为可选记录作者名与邮箱地址;version
参数也是必需的,版本号。版本号控制对于开发来说也是一块需要注意的事情,这里不展开;description
参数可选,简短描述这个软件包;url
项目地址,可选项;license
可选GPL
,MIT
等等,这块也是需要注意的事,不同的license
关系到后续的能否用于商业目的,是否需要公开源码等等,感兴趣的自己到https://choosealicense.com/licenses/
了解;packages
为必需项,这里的包比较简单find_packages()
。有些包放在lib
或者src
文件夹下,这时候就要用find_packages(where="lib")
或者find_packages(where="src")
来指定。python_requires
为指定的python
版本;install_requires
为该包的依赖包,用list
存放;entry_points
则控制当有可执行脚本时,来编译成的脚本名.比如这里的parse_genbank.py
是由BioFtParse
下的parse_genbank
中的main
来的。所以安装好后可以通过parse_genbank.py
来使用。categorizing
则是对这个包的一些属性进行声明,是可选的。
3.3 README.md 与 LICENSE
README.md
可以写这个项目是什么,可以用来处理什么,如何安装使用等等。LICENSE
就是写许可证。
3.4 MANIFEST.in
这个文件用来存放,封装发布是需要含有的文件。
3.5 Makefile
以上基本完成了整个包的封装,接下来就是发布。pypi
是目前python
主要的第三方库的仓库。平时下载包很多都是从这个仓库下载,上传的话也是上传到这里。当然新手测试可以先上传到testpypi
上。这个仓库与pypi
是互不影响的,可以说就是专门为测试建的仓库。要上传到上面需要先注册这两个仓库的账号。具体操作就是到网站主页注册,傻瓜式操作不讲。而在上传前我们需要用如下操作压缩好我们的包。
# 生成.tar.gz的源码包
python setup.py sdist
# 生成pip下载用的.whl文件,其实也是源码包与一些metadata信息压缩了下
python setup.py bdist_wheel --universal --bdist-dir /tmp/bdist_wheel
#以上两个命令会生成dist, XXX.egg-info, build中间文件夹,需要上传的是dist文件夹下的文件
# 接下来就是用twine将这些文件上传到testpypi或者pypi仓库上
# 先用pip install twine安装 twine
twine upload -r testpypi dist/*
# pypi
twine upload dist/*
而我为了偷懒,就将这些操作写在Makefile
里,这样以后我只需要make dist
或者make pypi
就可以进行这些操作。
cat BioFtParse/Makefile
## dist:
## python setup.py sdist;
## python setup.py bdist_wheel --universal --bdist-dir /tmp/bdist_wheel
##
## dist2:
## python setup.py sdist;
## python setup.py bdist_wheel --bdist-dir /tmp/bdist_wheel
##
## egg:
## python setup.py bdist_egg
##
## testpypi: dist
## twine upload -r testpypi dist/*
##
## pypi: dist
## twine upload dist/*
##
## clean:
## rm -rf build dist BioFtParse.egg-info
以上基本就是python
的打包流程,可满足大部分需求了。当然,如果是做专业开发的,那要在此基础上去找资料或者看别人的结构与setup.py
等等。
长按下方,关注公众号