模块的绝对导入相对导入

Posted 小仙女~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模块的绝对导入相对导入相关的知识,希望对你有一定的参考价值。

系统导入模块的路径(绝对导入)

  • 内存中:如果之前成功导入过某个模块,直接使用已经存在的模块

  • 如果内存中没有则使用内置中模块(安装路径下Lib文件中)

  • 如果以上两个地方都没有找到则去sys.path中寻找(sys这是用c写的一个模块,且不允许查看源码) sys.path是一个路径列表在运行的时候可以动态添加路径如果这三个都找不到则会报错,这样就需要我们在sys.path里面添加一个动态路径(最好不要放在Lib目录下,因为有可能会污染解释器路径)

    • 查看sys.path路径里面的内容

      import sys
      print(sys.path)
      得:
      [\'E:\\\\xiaoxiannv\', \'E:\\\\xiaoxiannv\', \'E:\\\\bao\\\\PyCharm2020.1.3\\\\plugins\\\\python\\\\helpers\\\\pycharm_display\', \'C:\\\\Python\\\\Python36\\\\python36.zip\', \'C:\\\\Python\\\\Python36\\\\DLLs\', \'C:\\\\Python\\\\Python36\\\\lib\', \'C:\\\\Python\\\\Python36\', \'C:\\\\Users\\\\baobao\\\\AppData\\\\Roaming\\\\Python\\\\Python36\\\\site-packages\', \'C:\\\\Python\\\\Python36\\\\lib\\\\site-packages\', \'E:\\\\bao\\\\PyCharm2020.1.3\\\\plugins\\\\python\\\\helpers\\\\pycharm_matplotlib_backend\']
      
      
    • __file__用来查看当前文件的绝对路径

    • 给不在同一目录下的模块添加一个新的路径(在sys.path中动态添加模块路径)

      • os.path.dirname()获取某个路径的父路径,通常用于获取当前模块的相对路径
      import sys   #用来获取添加模块的路径
      import os   #用啦获取模块的父路径
      sys.path.append(os.path.dirname(__file__)+\'/aa\')
      
      import pyth   #此处的pyth必须写在 import sys 、import os 的下边否则找不到路径,还有pyth爆红不是出错
      print(pyth.a)
      
      

导入模块的多种方式

  • import xxx 导入模块的所有成员
  • import aaa,bbb 一次性导入多个模块的成员(不建议使用)
  • from xxx import a 从某个模块中导入指定的成员
  • from xxx import a,b 从某个模块中导入多个指定的成员
  • from xxx import * 从某个模块中导入所有成员

import a 和from xxx import * 的区别

  • import a在使用模块中成员的时候必须加上模块名称

    import pyth   
    print(pyth.a)
    
  • from xxx import * 可以直接调用 此方法容易产生命名冲突(如果产生冲突·,后定义的成员生效(覆盖))

    from pyth import a  
    print(a)
    
    • 解决名称冲突问题

      • 改用import xxx方式

      • 自己避免使用同名

      • 使用别名解决冲突****

        • alias(as的缩写)

          • 给成员起别名避免名称冲突
          from  ss import s as d
          s=10
          print(s)
          print(d)
          
          得:
          10
          5
          
          • 给模块起别名,目的简化书写
          import ss as d
          
          print(d.s)
          

from xxx import *控制成员被导入

  • 默认情况下所有成员都会被导入

  • __all__是一个列表,列表内写的是成员名称(字符串形式)本模块可以被外界使用的成员

    • 注意:__all__只是对from xxx import * 这种导入方式生效,其余方式都不生效

      自定义模块

​ 运行模块,在此模块运行上面自定义模块时自定义使用了__all__,且里面只添加了s和a所以运行模块时 只能打印是s和a打印不出来c,

相对导入

注意:

  1. 相对路径不能在执行文件中使用
  2. 相对导入只能在被导入的模块中使用,使用相对导入,就不需要考虑执行文件是谁了,只需要模块之间路径的关系
  3. 顶层包之间不能相互访问(顶层包就是与执行文件处于同一目录下的包(在sys.path中添加路径除外))
  • mokuai就相当于是一个项目(相对导入就是,针对某个项目中的不同模块之间进行导入,称为相对导入)

  • xiangdui是顶层执行模块

  • 相对路径只有一种格式:from 相对路径 import xxx

    • 相对路径中的.号
      • . 表示当前的路径
      • ..表示的是父路径
      • ...表示父路径的父路径

  • 不使用相对导入的方式导入本项目的模块(直接找到父路径的父路径,然后加上要导入的文件名称)

以上是关于模块的绝对导入相对导入的主要内容,如果未能解决你的问题,请参考以下文章

模块导入循环导入模块查找顺序相对导入及绝对导入

详解Python中的相对导入和绝对导入

如何在 Python 模块中正确使用相对或绝对导入?

在Python中以绝对路径或者相对路径导入文件(或模块)的方法

第十七节:模块的导入总结

PYTHON-DAY18-包 相对 绝对导入