import
不同层级的模块导入方法
导入同级模块
import xxxxx
# 或
from xxxx import *
导入下级模块
import xxxxx
python2.x 需要确保隔壁文件夹下存
__init__.py
文件
导入上级模块
将上级目录添加进 sys.path 中,然后当做同级形式进行导入即可
import sys
sys.path.append("..")
import xxxxx
sys.path 的作用:当使用 import 语句导入模块时,解释器会搜索当前模块所在目录以及 sys.path 指定的路径去找需要 import 的模块,所以这里是直接把上级目录加到了 sys.path 里。
导入隔壁文件夹下的模块
import sys
sys.path.append("..")
from 隔壁文件夹 import xxxxx
或
from 隔壁文件夹.xxxx import *
python2.x
需要确保隔壁文件夹下存__init__.py
文件
引用机制
可以被 import 语句导入的对象是以下类型:
- 模块文件(.py/.pyc 文件)
- C 或 C++扩展(已编译为共享库或 DLL 文件)
- 包(包含多个模块)
- 内建模块(使用 C 编写并已链接到 Python 解释器中)
- 带有
__init__.py
文件的文件夹,它被视为一个包
import
导入包时的查找顺序
linux
[
"",
"/usr/local/lib/python3.4",
"/usr/local/lib/python3.4/plat-sunos5",
"/usr/local/lib/python3.4/lib-tk",
"/usr/local/lib/python3.4/lib-dynload",
"/usr/local/lib/python3.4/site-packages",
];
window
[
"",
"C:\\WINDOWS\\system32\\python34.zip",
"C:\\Documents and Settings\\weizhong",
"C:\\Python34\\DLLs",
"C:\\Python34\\lib",
"C:\\Python34\\lib\\plat-win",
"C:\\Python34\\lib\\lib-tk",
"C:\\Python34\\Lib\\site-packages\\pythonwin",
"C:\\Python34",
"C:\\Python34\\lib\\site-packages",
"C:\\Python34\\lib\\site-packages\\win32",
"C:\\Python34\\lib\\site-packages\\win32\\lib",
"C:\\Python34\\lib\\site-packages\\wx-2.6-msw-unicode",
];
其中 list 第一个元素空字符串代表当前目录。
导入模块
模块通常为单独的.py 文件,可以用 import 直接引用,可以作为模块的文件类型有.py、.pyo、.pyc、.pyd、.so、.dll
在导入模块时,解释器做以下工作:
- 已导入模块的名称创建新的命名空间,通过该命名空间就可以访问导入模块的属性和方法。
- 在新创建的命名空间中执行源代码文件。
- 创建一个名为源代码文件的对象,该对象引用模块的名字空间,这样就可以通过这个对象访问模块中的函数及变量
import
语句可以在程序的任何位置使用,你可以在程序中多次导入同一个模块,但模块中的代码仅仅在该模块被首次导入时执行。后面的 import 语句只是简单的创建一个到模块名字空间的引用而已。
sys.modules
字典中保存着所有被导入模块的模块名到模块对象的映射。
导入包
多个相关联的模块组成一个包,以便于维护和使用,同时能有限的避免命名空间的冲突。
一般来说,包的结构可以是这样的:
package
|- subpackage1
|- __init__.py
|- a.py
|- subpackage2
|- __init
有以下几种导入方式:
# 将模块subpackage.a导入全局命名空间,例如访问a中属性时用subpackage1.a.attr
import subpackage1.a
from subpackage1 import a
from subpackage.a import attr_a
使用 from 语句可以把模块直接导入当前命名空间,from 语句并不引用导入对象的命名空间,而是将被导入对象直接引入当前命名空间。