问题描述
现有的目录结构
- models
|- officals
||- __init__.py
||- utils.py
||- wide_deep
|||- census_dataset.py
其中,census_dataset.py 有这么一句导包 from official.utils.flags import core as flags_core
。
使用 pycharm 执行 census_dataset.py 没有问题,而在命令行执行报错
....\models\official\wide_deep> python census_dataset.py
Traceback (most recent call last):
File "census_dataset.py", line 32, in <module>
from official.utils.flags import core as flags_core
ModuleNotFoundError: No module named 'official'
...\models>python .\official\wide_deep\census_dataset.py
Traceback (most recent call last):
File "census_dataset.py", line 32, in <module>
from official.utils.flags import core as flags_core
ModuleNotFoundError: No module named 'official'
原因分析
sys.path:指定用于模块搜索路径的列表,默认包括了系统环境变量和要执行的文件所在路径
在 pycharm 执行时,会自动在 sys.path 中插入 '...\\models\\official\\wide_deep', '...\\wide_deep\\models'
,所以由于有 '...\\wide_deep\\models'
可以搜索到 official 包
而在命令行执行时,只会在 sys.path 中插入执行的 python 文件所在路径(即'...\\models\\official\\wide_deep'
),但没有插入 '...\\wide_deep\\models'
到 sys.path,所以找不到 official 包
解决方案
在 census_data.py 中增加一行代码
sys.path.append('...\\models')
之后,在命令行也能执行。
总结
当遇到已经安装完成的包,却发生 ModuleNotFoundError
时,就检查一下 sys.path
是否包括该包所在的路径