Python-模块搜索顺序

110 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情

1. 模块搜索顺序

Python的解释器在导入模块时,会:

  1. 搜索当前目录指定模块名的文件,如果有就直接导入
  2. 如果没有,再搜索系统目录 在开发时,给文件起名,不要和系统的模块文件重名

Python中每一个模块都有一个内置属性__file__可以查看模块的完整路径

代码演示如下所示:

import random
print(random.__file__)

程序运行结果如下图所示:通过此内置属性就可以查看random模块的完整路径

image.png

2. 原则--每一个文件都应该是可以被导入的

  • 一个独立的Python文件就是一个模块
  • 在导入文件时,文件中所有没有任何缩进的代码都会被执行一遍 实际开发场景
  • 在实际开发中,每一个模块都是独立开发的,大多都有专人负责
  • 开发人员通常会在模块下方增加一些测试代码
  • 仅在模块内使用,而被导入到其他文件中不需要执行

2.1 __name__属性

  • __name__属性可以做到,测试模块的代码只在测试情况下被运行,而在被导入时不会被执行
  • __name__是Python的一个内置属性,记录着一个字符串
  • 如果是被其他文件导入的,__name__是 模块名称
  • 如果直接执行模块,__name__ 保存的字符是 __main__ 在很多Python文件中都会看到以下格式的代码

2.2 案例演示

在main函数中针对文件进行测试

新建名为EX_1模块.py文件,其中代码如下所示:

def say_hello():
    print("你好你好,我是say hello")


# 如果直接执行模块,__main__
if __name__ == "__main__":
    print(__name__)

    # 文件被导入时,能够直接执行的代码不需要被执行
    print("小明开发的模块")
    say_hello()

运行EX_1模块.py文件,得到的运行结果如下图所示:因为如果直接执行模块本身,__name__ 保存的字符是 __main__,该程序中通过if判断,因为此时__name__保存的字符为__main__,因此会执行if下方测试代码。

image.png

新建名为EX_1测试导入.py文件,其中代码如下所示:

import EX1_模块
print("-" * 50)

运行结果如下图所示:因为该文件调用了EX_1模块.py模块,__name__保存的字符为模块名,不符合if条件,因此不会执行if下方的测试代码。

image.png