欢迎来到赛兔子家园

Python导入模块的3种方式

很多初学者经常遇到这样的问题,即自定义 Python 模板后,在其它文件中用 import(或 from...import) 语句引入该文件时,Python 解释器同时如下错误:

ModuleNotFoundError: No module named '模块名'

意思是 Python 找不到这个模块名,这是什么原因导致的呢?要想解决这个问题,读者要先搞清楚 Python 解释器查找模块文件的过程。

通常情况下,当使用 import 语句导入模块后,Python 会按照以下顺序查找指定的模块文件:
1、在当前目录,即当前执行的程序文件所在目录下查找;
2、到 PYTHONPATH(环境变量)下的每个目录中查找;
3、到 Python 默认的安装目录下查找;

以上所有涉及到的目录,都保存在标准模块 sys 的 sys.path 变量中,通过此变量我们可以看到指定程序文件支持查找的所有目录。换句话说,如果要导入的模块没有存储在 sys.path 显示的目录中,那么导入该模块并运行程序时,Python 解释器就会抛出 ModuleNotFoundError(未找到模块)异常。
解决Python找不到指定模块的方法有 3 种,分别是:
1、向 sys.path 中临时添加模块文件存储位置的完整路径;
2、将模块放在 sys.path 变量中已包含的模块加载路径中;
3设置 path 系统环境变量;

不过,在详细介绍这 3 种方式之前,为了能更方便地讲解,本节使用前面章节已建立好的 hello.py 自定义模块文件(E:\workbook\Python平时练习学习目录\python_module\hello.py)

say.py(E:\workbook\Python平时练习学习目录\my_package\say.py)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'tian'
__data__ = '2024/11/27 8:54'

# software: PyCharm

# hello.py
def say():
    print("Hello Word")

# say.py
import hello

显然,hello.py文件和say.py文件并不在同一目录,此时运行say.py文件,其运行结果为:

Traceback (most recent call last):
  File "E:/workbook/Python平时练习学习目录/my_package/say.py", line 8, in <module>
    import hello
ModuleNotFoundError: No module named 'hello'

可以看到,Python 解释器抛出了 ModuleNotFoundError 异常。接下来,分别用以上 3 种方法解决这个问题。

导入模块方式一:临时添加模块完整路径

模块文件的存储位置,可以临时添加到 sys.path 变量中,即向 sys.path 中添加 D:\python_module(hello.py 所在目录),在 say.py 中的开头位置添加如下代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'tian'
__data__ = '2024/11/27 8:56'
# software: PyCharm

import sys

sys.path.append("E:\\workbook\\Python平时练习学习目录\\python_module")
import hello

hello.say()

可以看到,程序成功运行。在此基础上,我们在 say.py 文件中输出 sys.path 变量的值,会得到以下结果:

['E:\\workbook\\Python平时练习学习目录\\my_package', 'E:\\workbook\\Python平时练习学习目录', 'D:\\PyCharm\\PyCharm 2019.1.3\\helpers\\pycharm_display', 'C:\\Python37\\python37.zip', 
'C:\\Python37\\DLLs', 'C:\\Python37\\lib', 'C:\\Python37', 'C:\\Python37\\lib\\site-packages', 'D:\\PyCharm\\PyCharm 2019.1.3\\helpers\\pycharm_matplotlib_backend',
'E:\\workbook\\Python平时练习学习目录\\python_module']

 该输出信息中,红色部分就是临时添加进去的存储路径。需要注意的是,通过该方法添加的目录,只能在执行当前文件的窗口中有效,窗口关闭后即失效。
导入模块方式二:将模块保存到指定位置
如果要安装某些通用性模块,比如复数功能支持的模块、矩阵计算支持的模块、图形界面支持的模块等,这些都属于对 Python 本身进行扩展的模块,这种模块应该直接安装在 Python 内部,以便被所有程序共享,此时就可借助于 Python 默认的模块加载路径。
Python 程序默认的模块加载路径保存在 sys.path 变量中,因此,我们可以在 say.py 程序文件中先看看 sys.path 中保存的默认加载路径,向 say.py 文件中输出 sys.path 的值,如下所示:

['E:\\workbook\\Python平时练习学习目录\\my_package', 'E:\\workbook\\Python平时练习学习目录', 'D:\\PyCharm\\PyCharm 2019.1.3\\helpers\\pycharm_display', 
'C:\\Python37\\python37.zip', 'C:\\Python37\\DLLs', 'C:\\Python37\\lib', 'C:\\Python37', 'C:\\Python37\\lib\\site-packages', 'D:\\PyCharm\\PyCharm 2019.1.3\\helpers\\pycharm_matplotlib_backend',
'E:\\workbook\\Python平时练习学习目录\\python_module']
上面的运行结果中,列出的所有路径都是 Python 默认的模块加载路径,但通常来说,我们默认将 Python 的扩展模块添加在lib\site-packages路径下,它专门用于存放 Python 的扩展模块和包。
所以,我们可以直接将我们已编写好的 hello.py 文件添加到lib\site-packages路径下,就相当于为 Python 扩展了一个 hello 模块,这样任何 Python 程序都可使用该模块。
移动工作完成之后,再次运行 say.py 文件,可以看到成功运行的结果:
Hello,World!

导入模块三:设置环境变量

PYTHONPATH 环境变量(简称 path 变量)的值是很多路径组成的集合,Python 解释器会按照 path 包含的路径进行一次搜索,直到找到指定要加载的模块。当然,如果最终依旧没有找到,则 Python 就报 ModuleNotFoundError 异常。
在成功设置了上面的环境变量之后,接下来只要把前面定义的模块(Python 程序)放在与当前所运行 Python 程序相同的路径中(或放在 Users/mengma/python_module 路径下),该模块就能被成功加载了。

posted on 2024-11-27 09:05  赛兔子  阅读(504)  评论(0)    收藏  举报

导航