import干了啥:
在 import xx 时,Python解释器会首先创建一个新的名称空间,这个名称空间用于存放 xx 模块中定义的名字,然后在该名称空间中执行 xx.py 文件。
具体例子来啦~
假设有目录路径如下:
- ROOT
-pk_1
- __init__.py
- m1.py
-pk_2
- __init__.py
- m2.py
- m3.py
- test.py
以下四种情况的import:
1. m3.py中 import m2:
m3与m2同目录,所以在m3中直接“import m2”即可
2. test.py中 import m1:
运行test.py时,当前目录是ROOT,所以直接“from pk_1 import m1”即可
3. 在m3中 import m2, 然后再test中 import m3:
1) 假设在m3.py中写“import m2”,在test中写"from pk_2 import m3":单独运行m3.py是没问题的,因为运行m3.py时,当前目录是pk_2,可以直接import m2。但是运行test.py就会报错,因为运行test时,当前目录是ROOT,import m2是找不到这个模块的
2) 假设在m3.py中写“from pk_2import m2”,在test中写"from pk_2 import m3":单独运行m3会报错。因为在当前目录pk_2下找不到pk_2;但是运行test就是正确的,因为在当前目录ROOT下找pk_2,然后import m2进来,是可以找到的
4. m3中 import m1
在m3中写“from pk_1 import m1”,是会报错的。因为在当前目录pk_2中时找不到pk_1的。所以现在要将ROOT这层目录加到sys.path里。所以要在m3.py里加上如下代码:
import sys, os
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
注意:
os.path.abspath(__file__) : m3.py所在路径,到文件级别
os.path.dirname(os.path.abspath(__file__)) : m3.py所在目录的路径,也就是pk_2
往后再套一层 os.path.dirname就是再少一层目录
参考:https://www.cnblogs.com/xingxia/p/python_package_module.html