python中的包就是一个目录,目录下必须有一个__init__.py
文件 这样的目录我们成为包。下边的P1就是一个1包
[root@node3 test]# tree .
.
└── p1
├── __init__.py
├── test1.py
└── test2.py
#__init__.py是一个空文件即可。
结构如下:
[root@node3 test]# tree .
.
├── main.py
└── p1
├── __init__.py
├── test1.py
├── test2.py
└── test3.py
[root@node3 test]# cat p1/test1.py
def f1():
print("this is f1")
[root@node3 test]# cat p1/test2.py
def f2():
print("this is f2")
[root@node3 test]# cat main.py
from p1 import test1,test2
test1.f1()
test2.f2()
[root@node3 test]# cat main.py
from p1.test1 import f1
f1()
查看test3的内容
[root@node3 p1]# cat test3.py
import test1
test1.f1()
执行正常
[root@node3 p1]# python3 test3.py
this is f1
这里在包外部的main文件中引入test3模块
[root@node3 test]# cat main.py
from p1 import test3
这里执行main.py直接报错,说找不到test1
[root@node3 test]# python3 main.py
Traceback (most recent call last):
File "main.py", line 1, in <module>
from p1 import test3
File "/root/test/p1/test3.py", line 1, in <module>
import test1
ModuleNotFoundError: No module named 'test1'
原因:是因为main.py在导入test3的时候,路径发生了变化,当main.py 导入test3时候,开始执行import test1时,是以main.py所在的路径为基准来搜索test1模块 main.py所在的路径没有test1当然就搜索不到,我们可以做一下测试。在main.py同级目录下创建一个test1.
[root@node3 test]# tree .
.
├── main.py
├── p1
│ ├── __init__.py
│ ├── test1.py
│ ├── test2.py
│ └── test3.py
└── test1.py
[root@node3 test]# cat test1.py
print("这是main.py同级目录下的test1")
def f1():
print("这是mian.py同级目录下的test1的f1函数")
在执行main.py
[root@node3 test]# python3 main.py
这是main.py同级目录下的test1
这是mian.py同级目录下的test1的f1函数
像这种场景,包内test3导入包内test1,包外文件又导入包内test3.
此时test3导入test1时应该如下写法就能解决路径问题
from . import test1
或者
from p1 import test1
[root@node3 p1]# cat test3.py
from . import test1
test1.f1()
执行成功
[root@node3 test]# python3 main.py
this is f