对于python新手来说也应该经常会看到python代码中有import 和 from… import 的身影,常说的这两种方式都是为了导入包或者模块,那么到底什么是包?什么是模块?它们之间又有啥区别么?… 请看本文讲解。
模块
模块到底指的是什么呢?模块,英文为 Modules,用一句话总结:模块就是 Python 程序,换句话说,任何 Python 程序都可以作为模块。 一般情况下,模块是一个以 .py 为后缀的文件。当然,其他可作为module的文件类型还有 “.pyo”、 “.pyc”、 “.pyd”、 “.so”、 “.dll”,但Python初学者几乎用不到。
模块的来源一般有三种方式:
- Python内置的模块(标准库);
- 第三方模块;
- 自定义模块。
包
那么包又是什么呢?包,英文为 Package,用一句话总结:包是含有Python模块的文件夹。当一个文件夹下有 __init__.py时,意为该文件夹是一个包,其下的多个模块构成一个整体,而这些模块都可通过同一个包导入其他代码中。其中 __init__.py文件用于组织包,方便管理各个模块之间的引用,控制着包的导入行为。
import 语句
import 语句用来导入模块,其语法为:import 模块名1 [as 别名1], 模块名2 [as 别名2],…,使用这种语法格式的 import 语句,会导入指定模块中的所有成员(包括变量、函数、类等)。不仅如此,当需要使用模块中的成员时,需用该模块名(或别名)作为前缀,否则 Python 解释器会报错。并且一个模块只会被导入一次,不管你执行了多少次import,这样可以防止导入模块被一遍又一遍地执行。
from 语句
from 语句则是从模块中导入一个指定的部分到当前命名空间中。其语法为: from 模块名 import 成员名1 [as 别名1],成员名2 [as 别名2],…: 使用这种语法格式的 import 语句,只会导入模块中指定的成员,而不是全部成员。同时,当程序中使用该成员时,无需附加任何前缀,直接使用成员名(或别名)即可。【如果想要导入指定模块中的所有成员,可以使用 from 模块名 import * ,当然,这种方式存在一定的风险,不推荐使用(最简单举例来说,两个模块中有同名的函数,那么这种方式会让编译器不知道调用哪一个)】
注意:用 [] 括起来的部分,可以使用,也可以省略。
实例代码:
''' 目录结构: test_dir ----|test1.py ----|test2.py ''' # test1.py 中的代码 def test1_func(): print("in test1.py") test1_a = 10 # 假设test2.py 想要使用test1.py 文件的中函数或变量,可以在文件中使用import关键字进行导入 # 方式1: import test1 # 此时会导入test1.py中的test1_func方法及test1_a 变量 test1.test1_func() # 能够正常调用 print(test1.test1_a) # 能够正常调用 # 方式2: from test1 import test1_func # 此时只导入了test1.py 中的test1_func方法 test1_func() # 能够正常调用 print(test1_a) # 报错!!! # 进阶 —— 多模块文件共享变量 ''' 具体实例可参照这篇大佬的博文:https://www.jianshu.com/p/4bb742d7d672。 在此只强调一下重点:import 模块名 和 from 包名 import 模块名 的“命名空间”是一样的,key都是该模块名,而 from 包名.模块名 import 变量 就相当于在本文件中写入了一行代码 变量= X,此时该变量就是 本文件自己命名空间的变量,只在本文件中有效。 '''
讯享网
错误:ModuleNotFoundError: No module named ‘模块名’
很多小伙伴儿经常遇到这样的问题,即自定义 Python 模板后,在其它文件中用 import(或 from…import) 语句引入该文件时,Python 解释器同时如下错误:
ModuleNotFoundError: No module named ‘模块名’ ,意思是 Python 找不到这个模块名,这是什么原因导致的呢?要想解决这个问题,读者要先搞清楚 Python 解释器查找模块文件的过程。
通常情况下,当使用 import 语句导入模块后,Python 会按照以下顺序查找指定的模块文件:
- 当前目录;
- 如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录;
- 如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/。
模块搜索路径都存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH 和由安装过程决定的默认目录。通过此变量我们可以看到指定程序文件支持查找的所有目录。换句话说,如果要导入的模块没有存储在 sys.path 显示的目录中,那么导入该模块并运行程序时,Python 解释器就会抛出 ModuleNotFoundError(未找到模块)异常。
解决该错误的方法有 3 种,分别是:
- 向 sys.path 中临时添加模块文件存储位置的完整路径;
- 将模块放在 sys.path 变量中已包含的模块加载路径中;
- 设置 path系统环境变量。
实例代码:
讯享网''' 目录结构: test_dir ----|test1 --------|test1.py --------|test11.py ----|test2 --------|__init__.py --------|test2.py --------|test22.py ----|test.py ''' # test1.py 中的代码 def test1_func(): print("in test1.py") test1_a = 10 # test2.py 中的代码 import test1 print(test1.test1_a) # 报错!!!ModuleNotFoundError: No module named 'test1' # 解决方法1:—— 临时添加模块完整路径 import sys sys.path.append("./test1") # 相对引入 import test1 print(test1.test1_a) ''' import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # 绝对引入 import test1.test1 as test1 print(test1.test1_a) ''' # 解决方法2:——将模块保存到指定位置 import sys print(sys.path) # 列出Python 默认模块的所有加载路径 # 通常来说,我们默认将 Python 的扩展模块添加在 lib\site-packages 路径下,它专门用于存放 Python 的扩展模块和包。所以,直接将已编写好的 test1.py 文件添加到lib\site-packages路径下,此时在运行下面代码将成功显示结果。 import test1 print(test1.test1_a) # 解决方法3:——设置环境变量 ''' 在 Windows 系统,典型的 PYTHONPATH 如下: set PYTHONPATH=e:\python\test_dir\test1; # test1.py 文件所在目录 在 UNIX 系统,典型的 PYTHONPATH 如下: set PYTHONPATH=/usr/local/lib/python/test_dir/test1 ''' # 设置完成后直接调用即可 import test1 print(test1.test1_a)
参考文献
- Python导入模块的3种方式(超级详细)
- Python 3.x | 史上最详解的 导入(import)
- https://www.runoob.com/python/python-modules.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/48371.html