出错描述

Test:
│  
├─main
│    main.py  
└─pak
     func.py

  如上图,我有个python项目叫Test,我的期望是pak文件夹当作自定义包,main文件夹里面是我的主程序,然后去调pak的包。现在我在main.py文件里面导入func.py里面的某个函数并运行main.py

from pak.func import func1

  结果发现,在Pycharm里面运行是没问题的。但是要是在Linux环境下,就会报错,提示找不到pak这个包。

出错原因

  涉及到的核心概念是 “命名空间软件包”。可以用下面的代码查看你的命名空间软件包地址:

import sys
print(sys.path)

  python的一个特点就是,会搜索命名空间软件包地址里面的每个文件来导入。

  为什么在Linux环境执行会出错? 执行main.py文件时,只会默认把父级目录(也就是main)添加到sys.path中,此刻去导入pakpython根本就搜索不到pak这个目录,所以会报错。解决方案就是在main.py写以下的代码,把项目目录添加到sys.path中:

import sys
# 当前文件父级的父级的绝对路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

  当然也可以在环境变量里把你项目地址添加进去,这样也会搜索到。但是如果你的项目要是经常换机器跑,或者机器环境经常重置的话,这样做似乎不太方便。

  为什么在PyCharm环境执行不会出错? 这是因为PyCharm会自动把项目根地址添加到sys.path中。可以在PyCharm环境下打印一下sys.path的值就能看出来了。