对于Python初学者来说,Python Project的结构和模块之间的调用方法难以理解和掌握。这里进行举例测试,在Python中自建模块,并由其他模块进行调用,来分析自建模块的使用方法以及出现的一些问题。
1. 分析Python Project的文件层次结构
这是一个Python Project,其结构如下图所示:
其中每个Python文件被称为一个模块。为了便于管理和使用,可以将同种类型的多个Python模块放入一个包(package)中,每个包(package)下面会自动创建“__init__.py”模块,该模块可以为空,它的存在用于标识其所在的文件夹是一个包(package),而不是普通的文件夹。
2. 创建Python自建模块
这里创建para模块,用于存放程序所用的常量。(图中的para.py文件)
# package01/para.py
PI = 3.1415926
再创建func模块,用于存放程序中需要调用的函数。(图中的func.py文件)
# package01/func.py
def calculate(a,b):
return a+b
将上述两个文件放入package01包中,以便于其他Python模块对其进行调用。
为了便于观察,在package01包中的__init__.py中写入如下代码:
# package01/__init__.py
print("调用了package01中的模块")
if __name__ == '__main__':
print("执行了package01/__init__.py")
这里插一句,如果单独运行__init__.py,则得到如下结果:
Out:
调用了package01中的模块
执行了package01/__init__.py
3. 调用自建模块
为了调用package01中para模块和func模块,分别创建test01和test02两个模块。其中test01.py放在另一个包package02中,而test02.py放在根目录中。
(1)其他包内的模块
对于包package02中的test01.py,写入代码如下:
# package02/test01.py
import package01.para as para
p = para.PI
运行后报错:
Traceback (most recent call last):
File "G:/lwc/workspace/Python/20220609/package02/test01.py", line 3, in <module>
import package01.para as para
ModuleNotFoundError: No module named 'package01'
No module named 'package01',可能是Python的运行环境中不包含此目录导致的。解决方法可以参考其他博主的博客。
(2)根目录中的模块
对于根目录中的test02.py,写入代码如下:
# test02.py
from package01.para import PI as p
from package01.func import calculate as ccl
print("p = " + str(p))
a,b = 3,5
c = ccl(a,b)
print("a + b = " + str(c))
运行后的输出结果如下:
Out:
调用了package01中的模块
p = 3.1415926
a + b = 8
可见根目录中的模块可以调用包内的自建模块,在调用时还会执行package01/__init__.py中的代码。
4. 小结
可见Python自建模块可用于根目录中的模块对其进行调用,但在其他包中的模块对其进行调用时却会报错。其解决方案有待进一步研究。