• import机制浅析


    import机制

    ​ 在我们执行python文件时,python通过sys.path进行路径搜索的,整体来说,分为三种搜索模式

    1.#系统的内置模块进行搜索; exp:os、sys模块
    2.#环境变量的路径; exp:pip install 安装的包
    3.#入口文件所在的目录;exp:我们直接使用python xxx.py的文件即为入口文件
    
    • 1
    • 2
    • 3
    入口文件

    ​ 值得一说的是我们的入口文件,因为像内置和环境变量在导入过程中大家都比较熟悉,

    一般情况下,我们直接使用python运行的文件就是我们的入口文件,一般使用main方法进行标识

    #使用内置__name__方法进行获取文件是否为入口
    if __name__ == '__main__':
        main()
    
    • 1
    • 2
    • 3

    ​ 入口文件一般具有一个特点就是目录层级为顶层的,不低于任何模块或者包,这样是为了在运行时,sys.path检测到的目录为最顶层,防止出现导入过程中无法找到包的问题。

    常见目录结构如下:

    #其中run.py作为入口文件
    ├── package
    │   ├──__init__.py
    │   ├── sub_1
    │   │   ├── __init__.py
    │     │     ├── module1.py
    │   │   └── module2.py
    │   └── sub_2
    │       ├── __init__.py
    │       └── module3.py
    └── run.py
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    绝对导入和相对导入

    ​ 在python中绝对导入和相对导入都有一个参考值,其中绝对导入是参考的项目根目录,我们的相对导入参考的是运行模块所在的目录

    绝对导入

    ​ 让我们从一个报错开始我们的绝对导入的讲解吧,我们知道使用绝对导入参考是根目录,创建如下对应的目录使用,cmd窗口运行
    在这里插入图片描述

    ​ 使用cmd运行提示No module named “test3”,我们查看机制可以发现我们遵循的是test1.py这个入口文件所在的目录进行导入,从上图可以看出test1文件属于package,在package中并不存在test3.py;

    实例证明:

    #test1.py
    import sys
    print (sys.path)
    #############输出结果#############
    ['C:\\Users\\x-149\\Desktop\\hahaha\\packge', 
     'C:\\Users\\x-149\\AppData\\Python\\Python38\\lib\\site-packages']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    从结果可以看出上述的说明我们在使用绝对路径时一定要把项目的根目录加入在我们的path路径中,防止出现一些未知的问题

    相对导入

    ​ 相对导入指的是相对当前路径进行导入
    在这里插入图片描述

    同级(package)进行导入报错no know parent package,可见这种写法是bad正确的相对导入应该是

    在这里插入图片描述

    相对于当前运行的目录的一个运行当然,如果我们想导入test2.py文件使用

    在这里插入图片描述

    也会报错no know parent package

    小结:使用相对导入是相对入口文件(顶级模块)所在目录下的子模块以及子包的导入

    解决import报错问题

    ​ 手动给\Lib\site-packages文件夹中建立一个.pth文件,内容为自己写的库绝对路径,这样就相当于添加了根目录

    小结

    ​ from import如果采用相对导入会出现各种导入出现异常问题,所以我们在库的导入过程中一般采用绝对路径的导入方式,简单直接方便,如果有些目录导入比较麻烦,可以将目录添加至根目录方便索引位置

  • 相关阅读:
    EFCore高级Saas系统下单DbContext如何支持不同数据库的迁移
    海康威视H5无插件方式显示WSS协议的视频的笔记
    3分钟搭建自己的MQTT服务器,就是这么简单!
    Spring Boot 6.2 实现后端与两个客户端之间的同步(逻辑)&&多线程&&读写锁
    排序---归并排序(简单优化前后比较)
    @Requestbody注解
    Go 语言入门指南:基础语法和常用特性解析
    基于SpringBoot+vue的token验证
    golang 数组 对象排序
    数据结构刷题:第十一天
  • 原文地址:https://blog.csdn.net/weixin_45336222/article/details/128083016