为什么这两个Python导入的工作方式不同?

为什么这两个Python导入的工作方式不同?,python,import,module,package,Python,Import,Module,Package,假设以下代码结构: #### 1/hhh/__init__.py: empty #### 1/hhh/foo/__init__.py: from hhh.foo.baz import * #### 1/hhh/foo/bar.py: xyzzy = 4 #### 1/hhh/foo/baz.py: import hhh.foo.bar as bar qux = bar.xyzzy + 10 我在1/内部运行python并导入hhh.foo.baz。它失败了: Traceback (mos

假设以下代码结构:

#### 1/hhh/__init__.py: empty

#### 1/hhh/foo/__init__.py:
from hhh.foo.baz import *

#### 1/hhh/foo/bar.py:
xyzzy = 4

#### 1/hhh/foo/baz.py:
import hhh.foo.bar as bar
qux = bar.xyzzy + 10
我在
1/
内部运行
python
并导入hhh.foo.baz。它失败了:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "hhh/foo/__init__.py", line 1, in <module>
    from hhh.foo.baz import *
  File "hhh/foo/baz.py", line 1, in <module>
    import hhh.foo.bar as bar
AttributeError: 'module' object has no attribute 'foo'
然后再次执行
导入hhh.foo.baz
。现在它可以工作了,虽然我正在加载相同的模块,但只绑定了不同的名称

这是否意味着
import module
from module import name
之间的区别不仅仅局限于标识符?这到底是怎么回事


(我知道我可以使用相对导入来解决所有这些问题,但我仍然想了解其中的机制。另外,我不喜欢相对导入,PEP 8也不喜欢。)

当您从hhh.foo.bar编写
时,导入xyzy
Python解释器将尝试从模块
hhh.foo.bar
加载
xyzy
。但是如果您编写
import hhh.foo.bar as bar
,它将首先尝试在
hhh.foo
模块中查找
bar
。因此,它计算
hhh.foo
,从hhh.foo.baz导入
*

hhh.foo.baz
尝试评估
hhh.foo
hhh.foo
尝试评估
hhh.foo.baz
,循环导入,异常。

1/hhh/foo/\uuuuuuu init\uuuuuuuuuuuuuuuuuuupy
中,您需要设置
\uuuuuuuuuuuuuuuuuuuuuuu all\uuuuuuuuuuu>列表,其中包含要导出的名称。i、 e.
\uuuu all\uuuuxy=[“xyzy”]

为什么要从hhh.foo中的hhh.foo.bar导入<代码>导入栏
应该足够了

# 1/hhh/foo/baz.py:
from hhh.foo.bar import xyzzy
qux = xyzzy + 10