Python的模块

模块的使用

>>> import math
>>> math.pow(2,3)
8.0

math就是一个模块,import引入这个模块,使用了模块中pow()这个函数。模块的好处就是:拿来就用,不用自己重写。

>>> dir(math)
['__doc__', '__file__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']
>>> math.pi
3.141592653589793

通过dir(),可以发现math模块中有以上这些函数。

说到底,模块也是像我们之前写过的后缀为.py的文件,因此我们可以自己定义模块。
例如:
在~/documents的路径下创建了文件:mymodule.py
文件内容如下:

#!/usr/bin/env Python
# coding=utf-8

name = "Python"

先告诉解释器,我自定义的模块放在哪里:

>>> import sys
>>> sys.path.append("~/documents/mymodule.py")

接着,使用import引入这个模块,并使用里面的变量。

>>> import mymodule
>>> mymodule.name
'Python'

解释器如何判断.py文件为程序执行还是作为模块引入

mymodule.py文件修改如下:

#!/usr/bin/env Python
# coding=utf-8

def name():
    return "Python"

if __name__ == '__main__':
    print name()

作为程序执行时:

$ python mymodule.py
Python

作为模块导入时:

>>> import sys
>>> sys.path.append("~/documents/mymodule.py")
>>> import mymodule
>>> mymodule.name()
'Python'

此时,mymodule.py中的函数name()就是一个属性:

>>> dir(mymodule)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'name']

同一个.py文件,可以作为程序直接运行,也可以作为模块导入

>>> __name__
'__main__'
>>> mymodule.__name__
'mymodule'

如果要作为程序执行,那么__name__ == '__main__'
如果作为模块导入,即变量__name__的值是模块名称。
用这种方式,便可区分是执行程序还是模块引入。
一帮情况下,如果是作为模块导入,可以不写:
if __name__ == '__main__'

模块的位置

上面提到,为了使得我们自己写的模块能够被Python解释器知道,需要这样:sys.path.append("~/documents/mymodule.py")。其实,在Python中,所有模块都被加入到sys.path里面了。用如下的方式可以看到模块所在位置:

>>> 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/Extras/lib/python',
 '/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',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC',
 '/Library/Python/2.7/site-packages',
 '~/documents/mymodule.py']

从中也可看到我们自己写的模块的位置。凡是在上面列表中所包括的位置内的.py文件都可以作为模板引入。

因此,复制文件mymodule.py到 '/Library/Python/2.7/site-packages'的位置下,改名为mymodule2.py:

$ sudo cp mymodule.py /Library/Python/2.7/site-packages/mymodule2.py
Password:
$ ls /Library/Python/2.7/site-packages/mymodule2.py
/Library/Python/2.7/site-packages/mymodule2.py

然后就可以直接导入了,而不需要再写路径:

>>> import mymodule2
>>> mymodule2.name

>>> mymodule2.name()
'Python'

也就是,要将模块文件放到合适的位置——就是 sys.path 包括位置——就能够直接用 import 引入了。

你可能感兴趣的:(Python的模块)