在 python 中导入模块

importing the module in python

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

正如 Andrea Corbellini 在评论中所说:

  1. 子模块是包内的模块。 Python 包只是 Python 个包含 __init__.py 文件的模块的目录。
  2. pkgname/__init__.py 每当您导入 pkgname 或其子模块之一(即示例的第 2 行和第 3 行)时都会使用。您的第一个示例不导入任何包或包模块,因此不需要使用 __init__.py(可以为空)

如果有这些文件,并且您正在处理同一个文件夹

./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)

为了让你的第二个问题更清楚一些。


当你这样做时 -

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__ 中列出的所有模块__init__.py ,如果该列表中没有列出任何模块,则 none 将被导入。例子-

假设我有

shared
   -- __init__.py
   -- a.py

__init__.py 看起来像 -

print("In Shared")

a.py 看起来像 -

print("In A")

现在在 shared 上面的目录中,打开 python,如果你这样做 -

from shared import *

它会打印出 -

In Shared

但是如果您将 __init__.py 中的代码更改为 -

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

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

In Shared
In A

如您所见,它只导入在 __all__ 列表中定义的子模块。


最后,当你做 -

import modulename

假设您直接从 packagename 中执行此操作,方法是将目录更改为该目录并在那里打开 python 交互式解释器。那时,您没有要求 Python 为您导入 packagename,因此它不需要导入 packagename ,因此它不会导入 __init__.py .