可重用的代码固然不错,不过可共享的模块更棒。通过作为 Python 模块共享你的代码就可以向整个 Python 社区开放你的代码,共享总是一件好事,学习如何创建、安装、和发布你的可共享模块,然后把你的模块加载到 WEB 上的 Python 软件共享网站,这样所有人都能受益于你的工作。

01. 函数转换为模块

模块就是一个包含 Python 代码的文本文件。对模块的主要需求就是要求文件名以 。py 结尾,这就是 Python 扩展名。要把你的函数转换为一个模块,需要把代码保存到一个适当命名的文件中。

Python 标准库里已经加载了大量的模块,而且他们已经在你的计算机上了。如果标准库里没有你要的模块,第三方 Python 模块可以在 PypI (Python Package Index,PyPI) 上查找需要的模块。

02. 注释代码

代码注释的方法为三重引号如: “”” 今天天气很好,这是个天气模块 “””

03. 准备发布

为了共享新创建的这个模块,需要准备一个发布。在 Python 中,所谓 “发布”(distribution)是指一个文件集合,这些文件联合在一起允许你构建。打包和发布你的模块。

一旦发布存在,就可以把模块安装到你的 Python 本地副本上,还可以把模块上传到 PyPI 与全世界共享。

01. 首先创建一个文件夹
  • 创建了文件夹之后,将 nester.py 模块文件复制到这个文件夹中。为简单起见,下面把这个文件夹命名为 nester。
02. 在新文件夹中创建一个名为 “setup.py” 的文件。
  • 这个文件包含有关发布的源数据。编辑这个文件,增加下面代码

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    form distutils.core import setup

    setup (
    name = 'nester',
    version = '1.0.0',
    py_modules = ['nester'],
    author = 'zinmm',
    author_email = 'zinmm@msn.cn'
    url = 'http://www.zinmm-dev.com'
    description = 'wild ones so 用尽脑细胞突突突'
    )

04. 构建发布

现在已经有了一个文件夹,其中包含两个文件:模块代码放在 nester.py 中,模块的有关源数据放在 setup.py 中。 现在构建你的发布。

03. 构建一个发布文件。
  • 发布工具包含有一个发布所需的所有功能。在 nester 文件夹中开开一个终端窗口键入一行命令: python3 setup.py sdist
04. 将发布安装到你的 Python 本地副本中。
  • 仍然在终端窗口中,键入以下命令:sudo python3 setup.py install

发布已经准备就绪。

05. 发布速览

利用 Python 的发布工具,你的模块已经转化成一个发布,并且安装在你的 Python 本地副本上。
开始时只有一个函数,这个函数输入到一个名为 nester.py 的文件中,这就创建了一个模块。然后创建一个名为 nester 的文件夹存放这个模块。通过在这个文件夹中增加一个名为 setup.py 的文件,从而能够构建和安装你的发布,这会生成一组额外的文件,并在 nester 文件夹中出现两个新的文件夹。这些文件和文件夹都是由发布工具为你创建的

图片

06. 导入模块并使用

既然已经构建了模块,并作为发布打包和安装,下面来看使用时还需要什么。要使用一个模块,只需把它导入到你的程序中,或者导入到 IDLE shell:

1
2
""" 使用 python 关键字 import 导入模块,不需要包含 .py 扩展名 """
import nester

07. Python 的模块实现命名空间

Python 中的所有代码都与一个命名空间关联。

主 Python 程序中(以及 IDLE shell 中)的代码与一个名为 main 的命名空间关联。将代码放在其单独的模块中时,Python 会自动创建一个与模块同名的命名空间。所以,你的模块中的代码会与一个名为 nester 的命名空间关联。

1
2
3
import nester

nester.print_lol(cast) // print_lol 便是 nester.py 里的函数名,详见《初识 Python》
PS: 如果使用 from nester import print_lol,会把指定的函数(这里便是 print_lol)增加到当前命名空间中,这样一来,就不必再使用命名空间限定。值得注意的是当前命名空间如果已经定义了一个名为 print_lol 的函数,这个特定的 import 语句就会用导入的函数覆盖你自己定义的函数。