要融入社区,第一步当然是要撰写一个自己的包。整个过程主要分为五步:
- 项目创建
- 搭建虚拟运行环境
- 编写项目代码
- 编写安装脚本
- 上传PyPi
GIT 创建项目
创建项目,确定项目名称,description, license等:
项目地址:https://github.com/shikanon/BaiduMapAPI
搭建虚拟环境
我们在搭建自己的库的时候,是希望有一个干净的项目环境的,这时候virtualenv
就很有用了,采用 virtualev
搭建虚拟环境,可以方便为后面生成私有项目的 requirement.txt
依赖包文件。
创建虚拟环境
代码语言:javascript复制virtualev venv
启用 virtualev
:
source venv/Script/activate
构建项目代码
简单,快速构建框架原型和骨架,记得包之间需要 __init__.py
文件,后面在编写setup.py
也会很有用。
项目结构:
构建好架构后,可以开始编写单元测试代码,pytest
是个简单易用的库,可以帮助我们快速完成单元测试构建。
构建安装脚本,编写 setup.py 文件
完成代码构建和测试就可以开始进入构建安装包环节。
Python三方库安装常用的主要有两种模式:一种是直接从 github 上 clone 下来用 setup.py
安装,另一种是用 pip install
来安装。两种安装方法都是需要编写 setup.py
文件的。
对于第一种方法我们在安装前一般还要提供安装的依赖包, 也就是requirement.txt
文件。在这里我们可以直接用 pip freeze
命令生成:
pip freeze > requirement.txt
因为我们是采用新建的虚拟环境开发,所以可以直接把环境中的三方库导入到requirement.txt
文件中。
构建好 requirement.txt
后,就可以编写安装脚本。
这里采用了setuptools
编写安装脚本,Setuptools是一个包开发过程库,其增强Python标准库distutils,使得打包Python项目更简单。
setup.py
文件案例:
from setuptools import Command, find_packages, setup
__lib_name__ = "BaiduMapAPI"
__lib_version__ = "0.1.1"
__description__ = "The Package of Baidu Map, with unofficial"
__url__ = "https://github.com/shikanon/BaiduMapAPI"
__author__ = "shikanon"
__author_email__ = "account@shikanon.com"
__license__ = "MIT"
__keywords__ = ["Baidu", "map"]
__requires__ = ["requests",]
with open("README.rst", "r", encoding="utf-8") as f:
__long_description__ = f.read()
setup(
name = __lib_name__,
version = __lib_version__,
description = __description__,
url = __url__,
author = __author__,
author_email = __author_email__,
license = __license__,
packages = find_packages(exclude=("tests", "exmaple")),
install_requires = __requires__,
zip_safe = False,
include_package_data = True,
data_files = [("BaiduMapAPI/data", ["BaiduMapAPI/data/BaiduMap_cityCode_1102.txt"])],
long_description = __long_description__
)
name
包名称
version
版本号
description
包描述
url
包地址
license
授权信息
packages
需要处理的包目录,也就是包含__init__.py
的文件夹
install_requires
需要安装的依赖包
data_files
可以用于引入一些额外的信息文件和数据,如图片、配置文件, [('文件要放入的文件夹1',['file1',file2']),('文件要放入的文件夹2',['file3',file4'])]
第一个元素指最后在文件要放的位置/目录,如果空字符,表示放在根目录,第二个元素指原文件所在的位置。
long_description
包的详细描述,后续上传到pypi
,可以用于显示在主页上的描述
find_packages():这个函数会默认在和setup.py同一目录下搜索各个含有init.py的包。
除了通过data_files
添加数据包文件,还可以通过package_data
设置可以被find_packages
找到添加的文件:
packages = find_packages(exclude=("tests", "exmaple")), # 所有包除了tests和exmaple
package_data = {
'': ['*.csv'], # 任何包中含有.csv文件,都包含它
'data': ['data/*.dat'], # 包含data包data文件夹中的 *.dat文件
}
写好setup.py
文件,可以python setupy install
进行安装测试。
注册 pypi 并上传自己的库
编写好安装脚本,就可以上传PyPi,当然,上传前要先看看上面是否已经有编写好的相关库了。
如果很幸运没有,那么可以开始上传自己的包了,这里我们采用twine
协助上传。
- 首先,完成PyPi的账户注册。
- 在用户目录下创建
.pypirc
文件, Linux在$HOME
创建.pypirc
, Windows在%HOMEDRIVE%
下创建.pypirc
,加入: [distutils] index-servers = pypi pypitest [pypi] repository: https://upload.pypi.org/legacy/ username: 账户 password: 密码 [pypitest] repository: https://test.pypi.org/legacy/ username: 账户 password: 密码 - 安装twine:
pip install twine
- 创建:
python setup.py sdist bdist_wheel
- 上传PyPi:
twine upload dist/*
上传成功后可以运行pip install
命令测试。
编写文档
编写README.md
和说明文档docs
,这里我们用sphinx
库来创建文档架构,sphinx
是一个智能、漂亮的文档生成工具。
初始化docs
文件夹
sphinx-quickstart
编写rst
文件,运行make html
即可生成html
文档,
rst
文档例子:
Welcome to BaiduMapAPI's documentation!
=======================================
.. toctree::
:caption: Basic concepts
:hidden:
api
dataset
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
注:
如果已经有配置文件了,可以用sphinx-build
来指定生成目录
sphinx-build -b html source/ build/
上传github
最后上传到 github,这样一个完整的 Python 三方包的开源完成了。
Windows上得中文Python二进制包资源: https://www.lfd.uci.edu/~gohlke/pythonlibs/