问:Python中包和模块都可以被都是用import关键字进行引入的, 那么两者有什么区别呢?
模块: 一般来说, 单个py文件就叫模块(module), 调用这个模块直接使用"import 模块名"即可, 也可以使用"from 模块名 import 函数名/变量名/类名"和"from 模块名 import * "
包: 当我们写了几个相近的py文件后, 想要集成起来给别人使用. 这时候就需要用到我们的包了.
包就是为了多个py文件打包起来访问的东西. 只要在包里面放一个init.py文件, 在init.py文件import包里面的模块(py文件), 就可以实现"import 包名", 实现对多个模块的调用.
下面我们举例说明一下就很容易清楚了:
import模块: 我们在debug文件中import module模块, 然后调用模块里面的fun函数. 两个文件在同个目录下
# module模块
def fun():
print("hello world")
# debug
import module
module.fun()
运行程序代码:
image.png
可以看到, 正常导入module文件并调用函数, 下面我们看看调用包.
"import 包": 我们需要导入模块1, 模块2的包(packet)
文件结构如下:
image.png
模块代码如下:
# module1
def fun1():
print("我是模块1的函数")
# module2
def fun2():
print("我是模块2的函数")
# debug代码
import packet
packet.module1.fun1()
直接import packet的话试试, 然后调用packet.module1.fun1(), 发现程序报错了, AttributeError: module 'packet' has no attribute 'module1'
image.png
这是因为python没法识别由多个py文件组成的包, 所以我们需要在包里面添加一个init.py文件. 在文件里面添加
import module1
import module2
文件结构如下:
image.png
重新运行代码,发现程序正常调用两个模块的内容, 也就是说成功import包
image.png
题外话: 如果不想在添加__init__.py是不是就没有办法访问module1和module2呢?
也不是, 利用在debug文件中引用时使用下面的语句也可以引用, 但它就不属于包结构了.包结构是含有__init__.py的文件夹, 而下面这种做法是属于导包中相对路径引用.
import packet.module1
import packet.module2