1. 简单模块文件

当项目简单,模块单一时,我们无需建立复杂的目录,只用简单地在相同文件夹下建立一个模块文件,将以供调用的函数都存放其中。在另一个文件中,我们通过import模块文件来调用其中的函数。

目录结构:

1
2
-module.py
-main.py

在模块文件 module.py中书写两个函数

1
2
3
4
5
def hello():
print('hello')

def bye():
print('bye')

在测试文件 main.py中调用模块中的函数

1
2
3
4
from module import *

hello()
bye()

2. 构建Python包

2.1 基础用法

当我们的项目较大时,可以通过将所有功能封装在一个或多个文件夹下,建立复杂的Python包,并在主文件中引用包导出的函数来实现项目的分离和集成。

一个简单的项目目录结构:

1
2
3
4
-modules
-__init__.py
-module.py
-main.py

首先,我们在项目根目录下构建里一个名为modules的文件夹,文件夹里存放了2个文件,分别是 __init__.py用于表明此文件夹为Python包,内部不需要写任何的代码;module.py里写入模块的函数。

module.py内容如下

1
2
3
4
5
def hello():
print('hello')

def bye():
print('bye')

main.py里调用modules.module文件内的函数。

1
2
3
4
from modules.module import * #导入所有函数,将hello和bye函数都引入
#from moduels.module import hello #只引入hello

hello()

2.2 进阶用法

在每次导入module内的函数时,我们都需要完整的写modules.module,有没有办法可以直接从modules导入所有函数呢?答案是有的。通过修改 __init__.py,我们可以在 main.py里直接用 from modules import *导入我们想用的所有函数。目录结构与2.1节一致,向 __init__.py中添加字段:

__init__.py内容

1
2
3
4
from .module import * #从与__init__.py相同目录下的module文件里,导入所有函数,这里是hello和bye
#from moduels.module import * #这种写法同样适用

__all__ = ['hello','bye'] #将需要的函数名导出包

需要注意的是:无论在包内还是包外,亦或者包的深层包的py文件,使用import引用其他包导出的函数,都是以最外层的文件,即main.py的路径为参考。换句话说,import绝对路径写法,包内py文件引用可以等价于在main.py中引用。而相对路径写法则参考的是当前py文件的路径。上面两种写法分别为相对路径和绝对路径写法。.module表示与init.py相同目录下的module文件,而from module import * 这种写法会报错,这是由于用了绝对路径,而在main.py的相同目录下无法找到module模块。

main.py内容

1
2
3
4
from modules import *

hello()
bye()

评论