Python Package制作及类库发布
很多人使用python,主要是被它非常丰富的库功能吸引。找到一个要做的事情,搜索对应的模块,然后用pip install或者easy_install就可以轻松的安装模块,然后使用。。。尤其对于一个之前一直工作在c++环境里,看到boost都兴奋很久的人而言,python的库功能无疑是我选择它重要的原因之一。
那么,是否可能自己制作自己的类库,然后发布给其它人使用呢?答案是肯定的,本文主要介绍如何制作一个自己的类库,供自己(在本地安装)或发布到pypi使用。
一. 制作类库
假设你的类库名称是first_test,那么类库应该满足如下格式:
first_test/
----setup.py
----setup.cfg
----README.md
----first_test/
---- __init__.py
---- real_logic_file.py
其中setup.py和子文件夹first_test是必须的。
前者定义了类库生成的基础格式:
from setuptools import setup setup(name='linpingta_first_test', version='0.1', description='linpingta first test for package', author='linpingta', author_email='linpingta@163.com', url = 'https://github.com/linpingta', packages=['linpingta_first_test'], install_required=['time', 'datetime'] )
这里面参数中,值得注意的是install_required:因为通常模块之间会有依赖,可能你的类库需要依赖一些基础类库,那么可以通过这个字段指定,这样pip知道在安装你的类库前先去安装你的依赖类库。name, version, author和author_emaill应该是必须参数,其它参数应该是选填(不完全确认,可以使用时check下)
后者定义类库的实际内容
最简单的情况下,只需要在first_test/_init_.py中定义逻辑,例如:
def hello():
return 'hello world'
但通常情况下,我们并不会把内容写在_init_文件中,而是使用单独的文件(例如real_logic_file.py),然后再在init中导入它,如下:
__init__.py
from .real_logic_file import hello
real_logic_file.py
def hello():
return 'hello world'
ok,你的类库已经制作好了,如果要在本地发布(安装到site-packages或者dist-packages),那么可以执行 python setup.py install就可以了。
二. 发布到PyPI
或许你并不满足于类库只在本地使用,而是希望把它放到PyPI上面,供所有人通过pip安装使用。那么需要做下面几件事:
在PyPI上注册账号, 这里多说一句是,除了PyPI外,还有一个用于模块测试的testpypi,用于模块正式发布前的测试,它是要单独注册账号的
填充setup.cfg和README.md 如果要使用markdown格式编辑README.md,那么在setup.cfg中添加如下一句:
[metadata] description-file = README.md
创建.pypirc,用于保留给PyPI的注册信息,放在根目录上,内容如下:
[distutils] index-servers = pypi pypitest [pypi] repository=https://pypi.python.org/pypi username=account_name password=account_password [pypitest] repository=https://testpypi.python.org/pypi username=account_name password=account_password
发布到PyPI,执行以下语句 (实际register, sdist和upload是三条独立的命令,可以分别执行)
python setup.py register sdist upload
三. 参考资料及更多
上述的内容主要来自以下两篇文章: 1. https://python-packaging.readthedocs.io/en/latest/minimal.html 2. http://peterdowns.com/posts/first-time-with-pypi.html 感觉文章里写的不清楚的地方,请直接check它们:)