最近几天居然被一个很基础的问题给困扰了。接触python不久,总是会报告有
No module named 'xxxx' 之类的问题。
查文档,都是说引入的问题。但问题来了,我在各自目录下的测试代码没有问题,但是一旦从应用的主文件开始执行,就会报错,而且很多本来单元测试都没问题的,都报错了。
百思不得其解。
甚至同一目录下的不同模块的互下引用,都会报找不到。这在我看来,太奇怪了,一定是有一个基础概念,我理解错了。我想。
就在我从网上看各种模块引用的文章的时候,大部份都是雷同的,但有一句突然引起我的注意。
主程序所在的目录,是本次执行环境的Root
我想,这应该是问题的根源。
举例说明吧:
app -------__init__.py
| -------main.py
| -------packageA ------- __init__.py
| | ------- aaaa.py
| | ------- test_aaaa.py
| -------packageB ------- __init__.py
| ------- bbbb.py
如果是这个结构,从main.py开始执行,和从test_aaaa.py开始执行,引用的路径是不一样的。
所有的引用路径,需要从主文件的目录作为 root 来出发来写。
如果 main.py 是主文件,则在test_aaaa.py中引用需要这么写:
import app.packageA 或是 from app.packageA import aaaa
import app.packageB 或是 from app.packageB import bbbb
如果 test_aaaa.py 是主文件,则在test_aaaa.py中引用需要这么写:
import aaaa
import sys
sys.path.append("../") 要加入环境变量,否则,引用不到
import packageB.bbb 或是 from bbb import packageB
python 中引用包,模块,类这个问题的最核心的知识点就是这个了。理解了这个,再复杂的引用关系也是手到擒来。
后面,再也没有出过这种问题了。为什么在网上没有找到一篇文章讲解这个内容,还是我有哪份文档没有看到?
记录一下,希望能解其他朋友的困惑