最近因为一个项目在边做边学Python,由于项目使用的MVC模式,所以存在项目下多个平行目录中py文件的相互引用问题,由于长期使用go的原因,对Python的包引入理解的不够深刻。
在*.py文件中使用
from Path_A.Path_B.Model_C import Func_D
会出现:
ModuleNotFoundError: No module named 'Path_A'
网上很多的帖子说到了这个问题的解决办法是在文件头使用sys.path.apped("..")这类的解决。个人觉得十分的蠢笨,在gitee上看到有的朋友的使用了一组sys.path.apped
sys.path.apped("..")
sys.path.apped("../..")
sys.path.apped("../../")
我也尝试了这类的办法,但还是会出现找不到模块的问题。最后发现问题还是出现在Python是一种解析器语言上,即在解释过程种需要我们给予路径说明。那一定有一种不这么蠢的办法存在,那就是.pth文件。
首先我们先要看一下Python现在的系统路径:
$> python3
Python 3.9.7 (default, Sep 10 2021, 14:59:43)
[GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.path)
['', '/usr/lib/python39.zip', '/usr/lib/python3.9', '/usr/lib/python3.9/lib-dynload', '/home/user/.local/lib/python3.9/site-packages', '/usr/local/lib/python3.9/dist-packages', '/usr/lib/python3/dist-packages']
找到:/home/user/.local/lib/python3.9/site-packages ,在该路径下创建一个你的项目名.pth文件。文件内容如下:
例:
/home/project_name
在运行:
$> python3
Python 3.9.7 (default, Sep 10 2021, 14:59:43)
[GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.path)
['', '/usr/lib/python39.zip', '/usr/lib/python3.9', '/usr/lib/python3.9/lib-dynload', '/home/user/.local/lib/python3.9/site-packages', '/home/project_name', '/usr/local/lib/python3.9/dist-packages', '/usr/lib/python3/dist-packages']
再运行项目下的文件都不会出现找不到模块的问题了。添加pth文件一劳永逸,不用每个项目文件中添加路径了。