自定义 Python 模块

模块的意义

任何一种优秀的编程语言都离不开丰富的模块(标准库,第三方库等)的支持,Python也不例外。Python有很强大的自有模块(标准库),还有海量的第三方模块。Python的社区也非常的活跃,很多开发者还在不断的贡献自己开发的新模块。

由于模块的丰富,对于很多常见的任务,很有可能已经有成熟的库或者模块帮你解决了,所以你只需要直接拿来用就可以了,这大大减少了开发者的工作量,极大的提高了工作效率。由于这样的便利性,会吸引更多的开发者加入Python的开发社区,同时他们又会贡献更多的模块出来,更加的繁荣了Python开发社区。

那么在Python中什么是模块呢?

什么是模块

在Python中模块就是一个写有Python代码的文件。例如 fibo.py 文件中有如下代码,用于打印 Fibonacci 数列:

1
2
3
4
5
def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while b < n:
        print b,
        a, b = b, a+b

那么这个fibo.py就是一个Python模块,去掉.py后缀的文件名就是这个模块的名字。

可能你还没有感觉到,你已经写好了一个自定义的Python模块了!对的,就是这么的简单。

如何使用模块

既然自定义的Python模块我们已经写好了,那么我们怎么使用它呢?
我们知道像 sysosmath 这样的Python标准库,在使用时可以直接使用 import sys 来使用,因为这些标准库的存放位置是Python默认的,所以不需要额外告诉Python解释器其位置。但是,对于我们自定义的Python模块,Python解释器并不知道这个模块在哪里,所以我们需要先告诉Python解释器其位置。

在Python中所有的模块都被加入到了 sys.path 里面了,我们可以把它打印出来看看模块所在的位置:

Python 2.7.10 (default, Jul 30 2016, 19:40:32) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
import sys
import pprint
pprint.pprint(sys.path)
['',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload',
 '/Users/potu/Library/Python/2.7/lib/python/site-packages',
 '/Library/Python/2.7/site-packages',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC']

我们可以用下面的代码,把我们的自定义Python模块所在的文件夹的路径加入到系统路径中,这样Python解释器就可以找到我们的自定义模块了。

 import sys
 sys.path.append('/Users/potu/Documents/lijiahan/codingcoder/python/learn_module/')
 import pprint
 pprint.pprint(sys.path)
['',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload',
 '/Users/potu/Library/Python/2.7/lib/python/site-packages',
 '/Library/Python/2.7/site-packages',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC',
 '/Users/potu/Documents/lijiahan/codingcoder/python/learn_module/']
 import fibo
 fibo.fib(10)
1
1
2
3
5
8
 

Great! 我们成功的用上了我们自定义的Python模块了,是不是很简单呀!