Skip to main content

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

在导入模块时,解释器做以下工作:

  1. 已导入模块的名称创建新的命名空间,通过该命名空间就可以访问导入模块的属性和方法。
  2. 在新创建的命名空间中执行源代码文件。
  3. 创建一个名为源代码文件的对象,该对象引用模块的名字空间,这样就可以通过这个对象访问模块中的函数及变量

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 语句并不引用导入对象的命名空间,而是将被导入对象直接引入当前命名空间。