出错描述
Test:
│
├─main
│ main.py
└─pakfunc.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
中,此刻去导入pak
,python
根本就搜索不到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
的值就能看出来了。