Python模块和包的导入相关概念

1. 导入的原理

当我们执行import module_name,Python会在两个地方寻找这个模块,第一是sys.path,所以对于安装好的库,我们直接import即可;第二是运行文件所在的目录。

顶层模块

假设当前目录A里有两个py文件和一个目录B,第一个文件导入的包里(在B)用from .. import m2调用了第二个文件,这时会报错。这是因为A里第一个文件本身就是顶层模块,而..是顶层的上一层,突破了这个层级,所以报错。

一个小问题

终端现在处于A目录,然后运行B目录的文件,这时所处位置参数是B目录的位置。也就是说,此时如果要导入A目录的文件,要将A目录加入sys.path中。

2. 绝对导入和相对导入

绝对导入
1
2
import module_name
from package import module_name

绝对导入用于导入sys.path的包和运行入口文件。也就是说,这种导入只适用于sys.path的包和运行入口文件。

相对导入

除了以上两种文件,还有非运行入口文件,导入需要使用相对导入。

相对导入的写法:

1
2
3
4
from . import mudule_name
from .package_name import module_name
from .. import module_name
from ..pakage_name import modle_name
Python2 和 Python3

对于导入机制,Python2 和 Python3是有区别的。对于下面两条语句:

1
2
import module_name
from package import module_name

Python2会将它们视为相对导入,Python3会将它们视为绝对导入。

2. Python中 -m的用法

官方解释

-m mod: run library module as a script (terminates option list)

作用就是把模块快当成脚本来运行。后面括号里内容意味着-m之后的其它选型不起作用。

原理解析

对于python -m name,Python会检索sys.path,查找名字为name的模块或者包(含命名空间包),并将其内容当成__main__模块来执行。

3. Python包和模块的区别

  • package: 包含__init__.py。一般来说是一个文件夹。
  • module: 包含__main__函数或者__main__.py文件。模块一般是一个文件,有时也可以是一个文件夹。

4. 实用用法

  • import module_name as alias
  • from module_name import function_name, variable_name, class_name
  • `from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, \
    LEFT, DISABLED, NORMAL, RIDGE, END    # 反斜杠换行`
    

5. 较好的实践

  • 首先注意入口文件位置、系统变量等,确定信息。
  • 根据要导入的文件的位置判断何种导入。
  • 导入文件。

参考资料

  1. Python 中 -m 的典型用法、原理解析与发展演变

  2. Python中import的用法