以下适用于3.0之前的 版本,3.0后版本有改动,详见https://www.python.org/dev/peps/pep-0420/
1. 模块
在编写程序的时候,经常引用其他模块,包括Python内置模块和第三方的模块以及自定义模块
导入模块时,是按照sys.path变量的值搜索模块,sys.path的值是包含每一个独立路径的列表,包含当前目录、python安装目录、PYTHONPATH环境变量,搜索顺序按照路径在列表中的顺序(一般当前目录优先级最高)
例一:
可以执行脚本成功,但只能导入当前目录的python文件,子文件web不能直接导入,会报ImportError
sys.path:
['/home/fantao/workspace/work', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/home/fantao/.local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/wx-3.0-gtk2']
常见问题:
如何引入某一特定路径下的模块
- 使用sys.path
- sys.path.append
- sys.path.insert
- 将一个路径加入到python系统路径下,避免每次通过代码指定路径
- 利用系统环境变量 export PYTHONPATH=modulepath, 只在执行命令当前终端界面有效
- 直接将这个路径链接到类似/Library/Python/2.7/site-packages目录下
建议:
- 一般不推荐使用from module import *, 容易覆盖当前名称空间中现有的名字,适合模块中变量名很长并且变量很多的情况
- 自定义的名称替换模块的原始名称,import testhello as th
2. package
通常package总是一个目录,可以使用import导入,或者from import来导入包中的部分模块。包目录下为首的一个文件便是 __init__.py。然后是一些模块文件和子目录,假如子目录中也有 init.py 那么它就是这个包的子包了。
- __init__.py的第一个作用就是package的标识, 可以将import web
- __init__.py是一个python文件,可以用来写python模块, 但不建议书写
优点
- 提高了代码的可维护性
- 避免函数名和变量名以及模块名冲突
3. 作用域
- 正常的函数和变量名是公开的, 可以被大家调用
- 类似__xxx__这样的变量是特殊变量,可以被直接引用,一般具有特殊用途, 定义变量一般不用这种变量名
- 类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用, 但也是可以被引用的
4. import
from module import *, 默认导出不以下划线开头的所有成员, 如下
In [3]: from hello import *
In [5]: age
Out[5]: 18
In [6]: _name
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
in ()
----> 1 _name
NameError: name '_name' is not defined
In [7]: test_hello()
hello
In [8]: _test_name()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
in ()
----> 1 _test_name()
NameError: name '_test_name' is not defined
import module, 会导出所有的变量和函数
In [9]: import hello
In [10]: hello.age
Out[10]: 18
In [11]: hello._test_name()
xiaoming
In [12]: hello._name
Out[12]: 'xiaoming'
In [13]: hello.age
Out[13]: 18