模块的使用
>>> 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
<function name at 0x1046d1c08>
>>> mymodule2.name()
'Python'
也就是,要将模块文件放到合适的位置——就是 sys.path 包括位置——就能够直接用 import 引入了。