Python 在显式导入之前,导入包中的模块不可见

Python 在显式导入之前,导入包中的模块不可见,python,packages,python-import,Python,Packages,Python Import,我有一个问题,我遇到过几次不同的软件包。我将包作为一个整体导入并尝试访问一个模块,但它显然不在那里。但是,一旦我显式地单独导入它,它就可以回到我最初导入的名称空间中。这里发生了什么事 示例如下: import email print(email.policy) AttributeError: 'module' object has no attribute 'policy' from email import policy print(email.policy) <module 'ema

我有一个问题,我遇到过几次不同的软件包。我将包作为一个整体导入并尝试访问一个模块,但它显然不在那里。但是,一旦我显式地单独导入它,它就可以回到我最初导入的名称空间中。这里发生了什么事

示例如下:

import email
print(email.policy)
AttributeError: 'module' object has no attribute 'policy'

from email import policy
print(email.policy)
<module 'email.policy' from 'C:\\Anaconda3\\lib\\email\\policy.py'>
来源于我过去写过的关于这一点的文章:

进口副作用 导入软件包并不意味着导入子软件包/子模块,尽管有时看起来可能是这样

考虑以下几点:

$ tree
.
└── pkg
    ├── __init__.py
    ├── mod2.py
    └── mod.py

1 directory, 3 files


$ tail -n 999 pkg/*
==> pkg/__init__.py <==

==> pkg/mod2.py <==
import pkg.mod
x = 2

==> pkg/mod.py <==
hi = 1


>>> import pkg
# Doesn't work!
>>> pkg.mod
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'mod'
# But if we import some module that has a side-effect of importing that module
>>> import pkg.mod2
# Suddenly it works!
# DON'T EVER DEPEND ON THIS BEHAVIOUR!
>>> pkg.mod
<module 'pkg.mod' from 'pkg/mod.py'>
简言之,有时导入一个包可能会导入其子包,但前提是该包的_init__u;.py导入它。一般来说,不要依赖于这种行为,要明确地导入子包