10.15 分�包¶
问题¶
ä½ å·²ç»�编写了一个有用的库,想将它分享给其他人。
解决方案¶
å¦‚æžœä½ æƒ³åˆ†å�‘ä½ çš„ä»£ç �,第一件事就是给它一个唯一的å��å—,并且清ç�†å®ƒçš„目录结构。 例如,一个典型的函数库包会类似下é�¢è¿™æ ·ï¼š
projectname/
README.txt
Doc/
documentation.txt
projectname/
__init__.py
foo.py
bar.py
utils/
__init__.py
spam.py
grok.py
examples/
helloworld.py
...
è¦�è®©ä½ çš„åŒ…å�¯ä»¥å�‘å¸ƒå‡ºåŽ»ï¼Œé¦–å…ˆä½ è¦�编写一个 setup.py ,类似下é�¢è¿™æ ·ï¼š
# setup.py
from distutils.core import setup
setup(name='projectname',
version='1.0',
author='Your Name',
author_email='you@youraddress.com',
url='http://www.you.com/projectname',
packages=['projectname', 'projectname.utils'],
)
下一æ¥ï¼Œå°±æ˜¯åˆ›å»ºä¸€ä¸ª MANIFEST.in æ–‡ä»¶ï¼Œåˆ—å‡ºæ‰€æœ‰åœ¨ä½ çš„åŒ…ä¸éœ€è¦�包å�«è¿›æ�¥çš„é�žæº�ç �文件:
# MANIFEST.in
include *.txt
recursive-include examples *
recursive-include Doc *
ç¡®ä¿� setup.py å’Œ MANIFEST.in æ–‡ä»¶æ”¾åœ¨ä½ çš„åŒ…çš„æœ€é¡¶çº§ç›®å½•ä¸ã€‚
ä¸€æ—¦ä½ å·²ç»�å�šäº†è¿™äº›ï¼Œä½ å°±å�¯ä»¥åƒ�下é�¢è¿™æ ·æ‰§è¡Œå‘½ä»¤æ�¥åˆ›å»ºä¸€ä¸ªæº�ç �分å�‘包了:
% bash python3 setup.py sdist
它会创建一个文件比如â€�projectname-1.0.zipâ€� 或 “projectname-1.0.tar.gzâ€�, 具体ä¾�èµ–äºŽä½ çš„ç³»ç»Ÿå¹³å�°ã€‚如果一切æ£å¸¸ï¼Œ 这个文件就å�¯ä»¥å�‘é€�ç»™åˆ«äººä½¿ç”¨æˆ–è€…ä¸Šä¼ è‡³ Python Package Index.
讨论¶
对于纯Python代ç �,编写一个普通的 setup.py 文件通常很简å�•。
一个å�¯èƒ½çš„é—®é¢˜æ˜¯ä½ å¿…é¡»æ‰‹åŠ¨åˆ—å‡ºæ‰€æœ‰æž„æˆ�包æº�ç �çš„å�目录。
一个常è§�错误就是仅仅å�ªåˆ—出一个包的最顶级目录,忘记了包å�«åŒ…çš„å�组件。
这也是为什么在 setup.py ä¸å¯¹äºŽåŒ…的说明包å�«äº†åˆ—表
packages=['projectname', 'projectname.utils']
大部分Python程åº�员都知é�“,有很多第三方包管ç�†å™¨ä¾›é€‰æ‹©ï¼ŒåŒ…括setuptoolsã€�distributeç‰ç‰ã€‚ æœ‰äº›æ˜¯ä¸ºäº†æ›¿ä»£æ ‡å‡†åº“ä¸çš„distutils。注æ„�å¦‚æžœä½ ä¾�赖这些包, 用户å�¯èƒ½ä¸�èƒ½å®‰è£…ä½ çš„è½¯ä»¶ï¼Œé™¤é�žä»–们已ç»�事先安装过所需è¦�的包管ç�†å™¨ã€‚ æ£å› 如æ¤ï¼Œä½ 更应该时刻记ä½�越简å�•越好的é�“ç�†ã€‚ æœ€å¥½è®©ä½ çš„ä»£ç �ä½¿ç”¨æ ‡å‡†çš„Python 3安装。 如果其他包也需è¦�çš„è¯�,å�¯ä»¥é€šè¿‡ä¸€ä¸ªå�¯é€‰é¡¹æ�¥æ”¯æŒ�。
对于涉å�Šåˆ°C扩展的代ç �打包与分å�‘就更å¤�æ�‚点了。 第15ç« å¯¹å…³äºŽC扩展的这方é�¢çŸ¥è¯†æœ‰ä¸€äº›è¯¦ç»†è®²è§£ï¼Œç‰¹åˆ«æ˜¯åœ¨15.2å°�节ä¸ã€‚