这可能是python的理想行为,但是我仍然感到困惑-

我具有以下文件结构:

repo/
    foo/
        __init__.py
        foo/
            bar.py


其中__init__.py是以下内容:

from .foo import bar


当我从repo/中输入python解释器时,我可以像这样导入bar

>>> from foo import bar
>>> bar
<module 'foo.foo.bar' from '.../repo/foo/foo/bar.py'>


大!但是,以下操作无效:

>>> import foo.bar as foobar
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'foo.bar'


也许我对python的import语句的工作方式缺乏了解,但是我非常希望能够如上所示进行导入。如果这是期望的行为,那么有人知道解决方法吗?也许我可以更改__init__.py中的某些内容?

出于对注意事项的命名的考虑,我还使用以下文件结构对此进行了测试:

repo/
    foo/
        __init__.py
        baz/
            bar.py


...我得到了相同的结果

我已经在linux和macOS的python 3.6.2和3.6.6中对此进行了测试。我在python 2.7.13中也看到了相同的行为(当然,我在下面的__init__.py目录中添加了foo/

如果我无法进行这种风格的导入,则repo/将不得不进行一些重构。帮我防止这种情况!

最佳答案

您要导入的模块的实际名称为foo.foo.bar。您在from .foo import bar中的__init__.py不会更改。

from foo import bar将为您提供bar模块对象的foo属性,而实际上正是您想要的模块,这要感谢__init__.py中的这一行。但是,import foo.bar需要一个实际的foo.bar模块。如果在sys.modules中找不到该名称的条目,则将引发错误。不要想弄乱sys.modules来“解决”这个问题。导致really confusing double-import bugs

10-07 19:12
查看更多