案例目录结构

1
2
3
4
5
6
7
8
9
10
11
12
# 目录结构示意图
# project/
# ├── task
# │ ├── main.py
# │ └── ....
# ├── util
# │ ├── xx_util.py
# │ └── ....
# └── ....


$ python task/main.py

sys.path 就会进入到task 目录中,这样main.py 想要 import main 目录外的模块就会出问题,例如import util.xx_util 就会出现 ModuleNotFoundError, 就算本目录下的文件 import task.xxx 也会出现错误,因为sys.path 不对,在task目录下就没有那些文件。

处理方案

这种情况怎么办呢?我看到过几种做法:

方案一

sys.path.append(‘..’) 将上一级目录 append 进来
非常不推荐这种做法,动态改变sys.path会使静态分析工具失效,例如pycharm 等IDE的代码提示。这在大型项目中会极大降低代码的可阅读性、增加开发难度
这是软件开发的灾难
(补充:通过环境变量PYTHONPATH 指定目录本质上也是sys.path 上append)

方案二

使用相对路径import .task.xxx ,from .. import util
同样非常不推荐这样做,特别是我们只是想临时debug一下子模块中的包的时候,修改好后还需要改回去,十分繁琐,还有可能带来不一致的问题
这是软件开发的灾难

方案三[ 推荐做法 ]

使用python -m task.main 执行程序
此时sys.path就在执行这行代码时所在的目录,也就是working directory, 而不会进入main所在的位置,这是十分简单的解决方法,不会带来新的问题