Python模块导入

玩转Python

这是我参与8月更文挑战的第16天,活动详情查看: 8月更文挑战

回顾复习

我们上期已经学习模块化编程

模块化编程思想能够帮助我们快速复用已开发的代码,把已经开发完善的代码封装成模块,需要用到的时候直接导入复用,来提高我们的工作效率。

模块组成包含: 函数、类、变量、可执行的代码

模块的来源有三种:

(1)Python内置模块如:time、os、sys等

(2)第三方模块如:MessagePack

(3)自定义模块

模块使用: 在程序中,通过模块导入来使用已开发好的功能

本期,我们来学习模块导入相关方式以及导入模块遇到的常见问题

🎵🎵废话不多说,我们来学习模块导入相关的知识吧,Let's go~

1. import语句导入

👉import 语句的基本语法格式如下:

  1. 导入一个模块

    import 模块名
    复制代码
  2. 导入多个模块

    import 模块1,模块2,...
    复制代码
  3. 导入模块并使用新名字

    import 模块名 as 模块别名 
    复制代码

👉import 加载的模块分为四个通用类别:

  • 使用Python编写的代码(.py文件)
  • 已被编译为共享库或DLL的C或者C++扩展
  • 包好一组模块的包
  • 使用C编写并链接到Python解释器的内置模块

2. form_import导入

Python 中使用from...import 导入模块中的成员。基本语法格式如下:

from 模块名 import 成员1,成员2,....
复制代码

如果希望导入一个模块中的所有成员,则可以采用如下方式:

from 模块名 import *
复制代码

如果导入模块成员需要取别名,则可以采用如下方式:

from 模块名 import 成员名 as 别名
复制代码

📢不建议使用 from 模块名 import *

(1)它表示导入模块中所有的不是以下划线(_)开头的名字都导入到当前位置。

(2) 由于不知道导入的名字,可能会覆盖之前已经定义的名字

(3) 可读性差,不便后期的维护查阅

3. importfrom ...import区别

  • import 导入的是模块

    (1) 模块都是.py结尾的文件

    (2) import 后面紧跟的是“文件名称”

    (3) import 导入模块中的成员时,必须要添加模块名或者模块别名前缀

  • from...import 导入的是模块中的一个函数或者一个类

    (1) 只能导入指定的成员

    (2) 导入模块中的成员时,无需使用任何前缀,直接成员名或者成员别名

4. __import__语句动态导入

import语句本质上是调用函数__import__().我们可以通过它实现动态导入,给__import__()动态传递不同的参数值,就能导入不同的模块

动态导入模块步骤:

(1) 定义变量,并赋值为模块的名字

(2) 调用__import__()传入变量

>>> s='math'
>>> m= __import__(s)
>>> m.pi
3.141592653589793
>>> m.sin(3.14)
0.0015926529164868282
复制代码

⚠️ 一般不建议使用__import__()导入,其行为在Python2和Python3有差异,会导致意外的错误,如果需要动态导入可以importlib模块

>>> import importlib
>>> a = importlib.import_module("math")
>>> a.pi
3.141592653589793
复制代码

5. 模块搜索路径

当我们使用import语句导入模块后,Python解释器会按照如下顺序找到指定的模块文件

⭐ 模块文件查找步骤:

  1. 当前目录查找。在当前执行的程序文件所在目录下查找
  2. PYTHONPATH环境变量下的每个目录中查找
  3. 到Python 默认的安装site-packages目录下查找

🌟 以上目录都是保存在标准模块sys 的 sys.path 变量中,通过此变量我们可以看到指定程序文件支持查找的所有目录。

如果导入的模块没有存储在sys.path显示的目录中,导入模块运行程序后,Python解释器就会抛出ModuleNotFoundError(未找到模块)异常

6. 模块导入常见问题

  • 模块不能二次导入。

    (1)设计理念:import only once

    (2)当导入一个模块时,模块中的代码都会被执行。

    (3)导入模块更多的是定义模块中的变量、函数、对象等,这些不需要反复定义和执行所以再次导入这个模块,则不会再次执行。

    总结: 一个模块无论导入多少次,这个模块在整个解释器进程内有且仅有一个实例对象

  • 模块导入之后提示找不到(No module named 'xxx'问题)

    (1) 对于第三方模块:先检查是否已下载模块,通过 CMD 查看pip list查看。
    如果没有的,则pip install 模块名下载

    (2) 方法一:临时添加模块完整路径

    向 sys.path 中临时添加模块文件存储位置的完整路径

    import  sys
    
    sys.path.append('path')
    复制代码

    (3) 方法二: 将模块保存到指定位置

    将模块放在 sys.path 变量中已包含的模块加载路径中

       模块文件添加到  `lib\site-packages` 路径下
    复制代码

    (4) 方法三:设置 path 系统环境变量。

    image.png

总结

本期,我们学习模块导入两种方式,import 导入和from...import

  • import 导入模块后,调用实例方法前需要写模块名作为前缀
  • from...import 导入模块中具体的成员,调用实例方法时可以直接使用

在实际工作场景中,以上两种方式来导入我们需要的模块,实现快速开发

以上是本期内容,欢迎大佬们点赞评论指正,下次见~ღ( ´・ᴗ・` )比心🌹🌹🌹🌹🌹✈️