自己写了一个效率高,功能简单易用的轮子,如何把它分享给其他人呢?部署到 PyPI 是一个不错方法。
包结构
一个正常的包结构如下(以 oneline 为例):
- Folder
- oneline
- __init__.py
- README.md
- LISENCE
- setup.py
oneline
文件夹就是自己写的库了,为必须项;README.md
是库的文档介绍;LISENCE
是这个包所使用的协议;setup.py
是这个包的配置脚本,为必须项。
虽然 README.md
和 LISENCE
不是必须的,但有这两个文件能方便使用者使用。
setup.py
setup.py
类似于一个配置的脚本,在生成和配置轮子的时候都会使用到。结构如下:
import setuptools
with open("README.md", "r", encoding="utf-8") as fh:
long_description = fh.read()
setuptools.setup(
name='one-line',
version='0.1.31',
description='Make every step oneLine.',
long_description=long_description, # 没有 README 这一项可以不要
long_description_content_type="text/markdown",
install_requires=[ # 该包的依赖包,安装时会检查是否满足依赖要求
'pandas',
'seaborn',
'scipy',
'scikit-learn'
],
packages=setuptools.find_packages(), # 该库中含有的包,一般就自动搜索
author='Zeesain Tsui',
author_email='clarenceehsu@163.com',
url='https://github.com/clarenceehsu/oneLine',
classifiers=[
'License :: OSI Approved :: MIT License',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
],
)
生成 Wheel
结构和 setup 的脚本搞定后,接下来就是生成上传 PyPI 所需要的文件了。首先 cd 到项目的目录下,输入下面的指令:
python3 setup.py sdist bdist_wheel
这样会在同目录的 ./dist
下生成两个文件,一个是轮子 whl
文件,一个是源码文件 tar.gz
。
上传包
接下来进行这一步需要有几个前提:
- 有 PyPI 的账号,没有的话需要去注册一个,然后记下账号密码;
- Linux 用户需要在用户目录下生成一个
.pypirc
文件,格式如下:
[distutils]
index-servers=pypi
[pypi]
repository = https://upload.pypi.org/legacy/
username = # 你的用户名
password = # 你的密码
- python 中需要安装
twine
库,用于上传两个包文件,没有的话通过pip
安装
接下来就要通过 twine
库来上传这两个文件,然后继续输入:
python3 -m twine upload dist/*
成功上传包文件之后,就可以使用 pip install <package name>
的命令检索到你自己的包了。
要注意的问题
- HTTP 403 问题,这一般是
.pypirc
文件设置不对,Windows 上我就没有成功,后来换到了 Linux 才避免了这个问题; - Permission 问题,上传的时候提醒你没有权限上传到某某包,那就是你的包与现有的包重名了,在
setup.py
中改名字即可; - 重复包名问题,上传的时候尽量保持
setup.py
版本号唯一。之前已经成功上传的包删了重新上传也会出现这个问题。
介绍一下 oneline
最后介绍一下自己的轮子(微笑)。
oneline
是一个基于 pandas
的数据分析库,具有不错的兼容性,旨在提供一个更简洁的代码方法,让研究人员或者比赛选手能够把更多的精力放在研究数据而不是研究框架上。
pip install one-line
oneline 这个名字已经被一个前端项目给占了,只得改成了 one-line。