python包调用问题

前言

以前其实一直不是很清楚包调用的具体情况,觉得可以调用就可以了,但是这次系分大作业上我想把结构设计得更好看一点,这时候包调用就出现了一些问题


嵌套调用

嵌套调用没什么特别的,就是在包中调用这个包里面的一个包,有结构如下

  • out_module
    • __init__.py
    • out.py
    • in_module
      • __init__.py
      • in.py
  • test.py

在out_module这个包中的out.py中调用in_module的in.py只需要在out.py中

1
from out_module.in_module import in


平行调用

平行调用就是两个包在路径上市并列的,从一个包中调用另一个包中的模块或者函数,如下就是在m1.py中调用m2.py或者m2.py中的函数或者变量

  • module1
    • __init__.py
    • m1.py
  • module2
    • __init__.py
    • m2.py

谷歌搜到的方法是往sys.path中添加被调用包处在的路径,类似如下

1
2
import sys
sys.path.append("G:\\大三下\\test\\test_module")

这样可以解决问题,但是代码看起来不是很好看,可移植性也不高,毕竟如果需要部署的话也要修改这个路径值。所以我给出了一个稍微好一点的几角方法

1
2
3
4
5
6
import sys
import pathlib
BASE_DIR = pathlib.Path(__file__).parent.parent
models_path = BASE_DIR / "module2"
sys.path.append(str(models_path))
import m2

注意pathlib.Path(__file__).parent.parent返回值是一个WindowsPath对象实例,如果是往sys.path中直接添加是没有效果的,所以要用str转为字符串。