包的使用

包的使用

一、定义

  • 包是集合了一组py文件,提供了一组复杂的功能
  • 当提供一组复杂的功能,一个py文件放不下的时候需要用到包
  • 每一个pack包中必须包含一个__init__.py文件,这是包和目录的区别
  • 导入包相当于执行了包下边的__init__.py文件

二、从包中导入模块的方式

  • 方式一:直接导入
    • import pack1.pack2.pack3.模块名
      pack1.pack2.pack3.模块名.变量/函数名
    • import pack1.pack2.pack3.模块名 as 别名
      别名.变量/函数名
    • from pack1.pack2.pack3 import 模块名
      模块.变量/函数名

      这种方式更加常用

  • 方式二:复杂的导入
    • 首先必须每一级的包的__init__.py文件中都加上pack的导入路径
    • 再按照方式一的方式来导入文件

    init.py文件中pack导入包的路径:

    • 使用绝对路径导入:from pack1 import pack2-->from pack1.pack2 import pack3,
      每一级的导入都必须是绝对路径,这种方式在包的位置不改变的情况下是适用的,但是如果包的位置发生改变就会报错。
    • 使用相对路径导入:在每一级的__init__.py文件中写入from . import 下一级的pack/模块名,这样可以有效的避免绝对路径的问题。
      需要特别注意的是:使用了相对路径导入的文件只能被当做模块来使用,不能被当作脚本文件来执行,如果到做脚本文件来执行程序会报错
    • 复杂的导入适用于整个包文件的开发,这个包给其他开发者使用的情况,日常的练习中直接导入方式就可以满足需求。

三、查看包/模块/文件的路径

  • 在代码中查看路径需要用到sys模块
  • import sys, print(sys.path)查看当前的所有绝对路径
  • 当存在多个包目录下,直接导入某一个包或者文件时(包/文件与当前的文件不在同一个包下),需要把先找到两个文件/包共同的目录路径,再把路径添加到sys.path中,
    此时再导入包/文件即可。

__file__获取的是当前文件的绝对路径

```python 
# path_list = ['', 'Volumes', 'workspace', 'python-study', 're_st', 'pack1', '模块导入练习']
path_list = __file__.split('/')[:-1]
# 也可以使用pop()来剔除掉不需要的目录
# __file__获得的是当前文件的绝对路径,把绝对路径切割成目录列表,去掉本文件的目录
# 留下需要导入的文件和当前文件共同的目录
path_list.append('core')
# 在共同的目录列表中加入需要导入文件的剩下的目录
base_path = '/'.join(path_list)
# 用join拼接字符传列表为整体的目录
path = sys.path.append(base_path)
# 把导入文件的路径加入到sys.path
import 要执行的文件
print(要执行的文件.name)
要执行的文件.test()
# 执行导入文件即可
```

四、总结

如果是直接导入一个包,相当于直接执行了包下边的__init__.py文件,并不会把包下边的其他包和py文件导入到内存中;
如果希望直接导入包后下边的包和其他的py文件都能直接通过包来导入,那么需要在__init__.py文件中去自定义处理。

posted @ 2020-02-11 09:10  大道至诚  阅读(148)  评论(0编辑  收藏  举报