python包

一、包的定义

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")

1.引入包内模块

[root@node3 test]# cat main.py 
from p1 import test1,test2
test1.f1()
test2.f2()

2.导入包内模块的方法

[root@node3 test]# cat main.py 
from p1.test1 import f1
f1()

3.特殊场景

1.单独执行test3

查看test3的内容

[root@node3 p1]# cat test3.py 
import test1

test1.f1()


执行正常
[root@node3 p1]# python3 test3.py 
this is f1

2.引入test3文件

这里在包外部的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函数

3.解决路径问题

像这种场景,包内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

你可能感兴趣的:(python,python,开发语言)