Python3模块
在程序中定义函数可以实现代码重用。但当你的代码逐渐变得庞大时,你可能想要把它分割成几个文件,以便能够更简单地维护。同时,你希望在一个文件中写的代码能够被其他文件所重用,这时我们应该使用模块(module)。
一、导入模块
在Python中,一个.py
文件就构成一个模块。一个模块中的定义可以导入(import)到另一个模块或主模块。
比如你可以通过内置模块platform来查看你当前的操作平台信息:
import platform
s = platform.platform()
print(s)
# 我的输出:Linux-3.15.8-200.fc20.x86_64-x86_64-with-fedora-20-Heisenbug
每个模块有其私有的符号表,在该模块内部当成全局符号表来使用。 当我们将一个模块导入到当前模块时,只有被导入模块的名称被放入当前模块的全局符号表里,所以我们不用担心变量名发生冲突。
其他几种导入方式:
1、import a as b
:导入模块a,并将模块a重命名为b。
import time as x
s = x.ctime()
print(s)
2、from a import func
:直接把模块内的函数或变量的名称导入当前模块符号表里。
from time import ctime
s = ctime() # 这时可以直接调用函数,而不用再使用time.ctime()
print(s)
3、from a import *
:导入模块中所有的名字(以下划线开头的名字除外)到当前模块符号表里。
from time import *
s = ctime()
print(s)
注意:导入 * 是不好的,因为它常常产生难以阅读的代码,并且会容易产生名字冲突。
二、模块搜索路径
当导入名为 a 的模块时, 解释器会先从内建模块尝试匹配,如果没找到,则将在 sys.path
记录的所有目录中搜索 a.py 文件,而sys.path
则包括:
- 当前程序所在目录
- 标准库的安装目录
- 操作系统环境变量PYTHONPATH所包含的目录
变量 sys.path 是一个字符串列表,它为解释器指定了模块的搜索路径。它通过环境变量 PATHONPATH 初始化为一个默认路径,当没有设置 PYTHONPATH 时, 就使用内建默认值来初始化。你可以通过标准 list 操作来修改它:
>> import sys
>>> sys.path.append('/ufs/guido/lib/python')
三、模块的__name__
对于任何一个模块,模块的名字都可以通过全局变量 __name__
得到:
import time
s = time.__name__
print(s) # 输出time
一个模块既可以在其它模块中导入使用,也可以当作脚本直接运行。不同的是,当导入到其他模块时,__name__的值是被导入模块的名字;而当作为脚本运行时,__name__的值被设为“__main__“:
# test.py
if __name__ == '__main__':
print('This program is being run by itself')
else:
print('I am being imported into another module')
当作脚本执行:
$ python test.py
This program is being run by itself
当作导入模块使用:
>>> import test
I am being imported into another module
>>>
四、dir() 函数
内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回:
>>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__',
'__package__', '__stderr__', '__stdin__', '__stdout__',
'_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe',
'_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv',
'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder',
'call_tracing', 'callstats', 'copyright', 'displayhook',
'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix',
'executable', 'exit', 'flags', 'float_info', 'float_repr_style',
'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',
'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit',
'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount',
'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path',
'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1',
'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit',
'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout',
'thread_info', 'version', 'version_info', 'warnoptions']
如果没有给定参数,那么 dir() 函数会罗列出当前定义的所有名称:
>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir() # 得到一个当前模块中定义的属性列表
['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']
>>> a = 5 # 建立一个新的变量 'a'
>>> dir()
['__builtins__', '__doc__', '__name__', 'a', 'sys']
>>>
>>> del a # 删除变量名a
>>>
>>> dir()
['__builtins__', '__doc__', '__name__', 'sys']
>>>
五、包
可以把多个模块,即多个.py文件,放在同一个文件夹中,构成一个包(Package)。例如:
sound/ *包
__init__.py 初始化这个声音包
formats/ 格式转换子包
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ 音效子包
__init__.py
echo.py
surround.py
reverse.py
...
filters/ 过滤器子包
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
注意:在每个包文件夹里都必须包含一个 __init__.py 的文件,告诉Python,该文件夹是一个包。__init__.py 可以是一个空文件。
我们可以通过import 包名.模块名
导入包中的子模块,例如:
import sound.effects.echo
当然,也可以使用from... import...
句式导入包中的模块:
from sound.effects import echo # 导入echo子模块
from sound.effects.echo import echofilter # 导入echo子模块中的函数或变量
from sound.effects import * # 导入__all__变量中所有的子模块
六、安装第三方模块
在Python中,安装第三方模块,是通过包管理工具pip完成的。
如果你正在使用Mac或Linux,安装pip本身这个步骤就可以跳过了。
如果你正在使用Windows,请参考安装Python一节的内容,确保安装时勾选了pip
和Add python.exe to Path
。
在命令提示符窗口下尝试运行pip
,如果Windows提示未找到命令,可以重新运行安装程序添加pip
。
注意:Mac或Linux上有可能并存Python 3.x和Python 2.x,因此对应的pip命令是pip3
。
例如,我们要安装一个第三方库——Python Imaging Library,这是Python下非常强大的处理图像的工具库。不过,PIL目前只支持到Python 2.7,并且有年头没有更新了,因此,基于PIL的Pillow项目开发非常活跃,并且支持最新的Python 3。
一般来说,第三方库都会在Python官方的pypi.python.org网站注册,要安装一个第三方库,必须先知道该库的名称,可以在官网或者pypi上搜索,比如Pillow的名称叫Pillow,因此,安装Pillow的命令就是:
pip install Pillow
耐心等待下载并安装后,就可以使用Pillow了。
上一篇: async 函数的实现原理
下一篇: Python3函数