如何制作一个自己的: 首先,需要创建一个 文件夹,将其作为 顶层包,在此文件夹内我们可以定义各个不同的 子文 件夹与 .py 文件作为各个子包与模块 注意:在每个包文件夹下都需要有一个 __init__.py 文件,此文件可以为空
例如:我们创建一个文件夹Test作为顶层包文件夹,在Test内添加 __init__.py Top.py
[wangml@iZwz976helaylvgqok97prZ pythoncode]$ ls Test__init__.py __pycache__ Top.py[wangml@iZwz976helaylvgqok97prZ Test]$ cat Top.py def top(): print("Top!") return
接下来,我们创建一个在与 Test 在同一目录层次的 Test.py 文件,在它里面导入Test包 并引用Test包中包含的模块 Top 中的函数 top
[wangml@iZwz976helaylvgqok97prZ pythoncode]$ cat Test.py import TestTest.Top.top()执行Test.py这个文件,我们会看到什么呢?是输出 "Top!" 吗?[wangml@iZwz976helaylvgqok97prZ pythoncode]$ python3 Test.py Traceback (most recent call last): File "Test.py", line 2, inTest.Top.top()AttributeError: module 'Test' has no attribute 'Top'
我们看到上面的输出结果,提示在 Test 中并没有找到模块 Top ,这是为什么呢? 问题出在 __init__.py 文件上,我么来看一下 __init__.py 文件
[wangml@iZwz976helaylvgqok97prZ Test]$ cat __init__.py
这是一个 空文件。我们在前面说过,每个包文件内都需要包含一个 __init__.py 文件,只 有这样,这个 文件夹才能被识别为一个Package,否则就仅仅是一个文件夹。 而在上面的出错消息中我们看到,出错的在第二行, 证明 Test 这个包被成功导入了,但 第二行出了错,在 Test 内找不到 Top 这个模块。但我们已经将 Top.py 文件放在了Test 这个文件夹下的,为何会找不到呢?原因还是在 __init__.py 文件上。 虽然 Test 内有 __init__.py 文件,但仅仅这样,我们只能使 Test 被识别为一个Package, 而 无法引用 内部的模块。我们需要 在 __init__.py 文件中先导入 Top 模块,才能在外部导入 Test包 时使用这些模块,下面我们修改一下 __init__.py 文件,再执行Test.py看看结果: 和我们设想的一样,输出了 "Top!"
[wangml@iZwz976helaylvgqok97prZ Test]$ vim __init__.py [wangml@iZwz976helaylvgqok97prZ Test]$ cat __init__.py from Test import Top[wangml@iZwz976helaylvgqok97prZ Test]$ cd ../[wangml@iZwz976helaylvgqok97prZ pythoncode]$ python3 Test.py Top!