在python

时间:2015-08-22 09:01:56

标签: python python-import

我正在学习Python,在学习模块时,我想到了两个疑问。

  • 怀疑#1:

    我知道该模块只是简单的python文件,例如filename.py,但Python中的子模块是什么?

  • 怀疑#2:

    考虑以下三行代码:

    import modulename
    from pkgname import modulename
    from pkgname import *
    

    这三个语句是使用__init__.py(在pkgname包内)还是仅使用第三个语句?

2 个答案:

答案 0 :(得分:4)

让你的第二个问题更加清晰。

当你这样做时 -

import packagename.modulename

from packagename import modulename

Python内部首先导入packagename,当我说python导入packagename时,我的意思是它导入该包的__init__.py,然后导入modulename 。这就是为什么当您执行上述任何操作时,它会导入__init__.py

当你这样做时 -

from packagename import *

请注意,默认情况下,这不会从packagename导入modulename,这只会从packagename中导入__init__.py,而__all__列出的所有模块都列在{{ 1}},如果该列表中没有列出任何模块,则不会导入任何模块。示例 -

让我说我有

__init__.py

shared -- __init__.py -- a.py 看起来像 -

__init__.py

print("In Shared") 看起来像 -

a.py

现在在print("In A") 上面的目录中,打开python,如果你这样做 -

shared

它会打印出来 -

from shared import *

但是如果您将In Shared 中的代码更改为 -

__init__.py

从相同的位置进行相同的导入,它会打印出来 -

print("In Shared")
__all__ = ['a']

如您所见,它只导入In Shared In A 列表中定义的子模块。

最后,当你这样做时 -

__all__

让我们说你直接从import modulename 内部做到这一点,通过改变目录并在那里打开python交互式解释器。那时候,你不是要求Python为你导入packagename,所以它不需要导入packagename,因此它不会导入packagename

答案 1 :(得分:3)

Andrea Corbellini在评论中说:

  1. 子模块是包内的模块。 Python包只是一个包含__init__.py文件的Python模块目录。
  2. 每当导入pkgname或其子模块之一(即示例的第2行和第3行)时,都会使用
  3. pkgname/__init__.py。您的第一个示例不会导入包的任何包或模块,因此它不需要使用__init__.py(可以为空)
  4. 如果有这些文件,并且您正在处理同一文件夹

    ./pkgname/__init__.py  # Submodule of pkgname package used on example 3) to import all the submodules
    ./pkgname/Asdf.py  # Submodule of pkgname package
    ./pkgname/modulename.py  # Submodule of pkgname package imported in example 2) using __init__.py
    ./modulname.py  # Module imported on example 1)