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�节中。