这可能是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。