了解Python3导入方法的工作方式

时间:2019-05-10 03:37:39

标签: python-3.x python-import

我一直在研究python3应用程序,但遇到一个奇怪的问题,在使我非常烦恼之后,我开始好奇了。

我的文件结构是这样的:

root/
 |   __init__.py
 |   main.py
 |   fuzzy/
     |    __init__.py
     |    foo.py
 |   dreamy/
     |    __init__.py
     |    bar.py
     |    meh.py

所以我需要在foobar中都使用meh模块的方法。

bar中,我写道:

from fuzzy.foo import foo_function

那工作得很好。

现在在meh中,我使用了完全相同的语法,但最终出现导入错误:

ModuleNotFoundError: No module named 'fuzzy'

我设法使用this方法解决了这个问题,但我想了解为什么会这样。

根据Python3 documentation,我的导入语法正确:

  

导入子模块的另一种方法是:

     

from sound.effects import echo

这似乎也是answered question on this forum

提供的语法

此外,barmeh都位于同一目录中,并且它们的代码以完全相同的方式开头。

有人知道为什么在一个文件中而不是另一个文件中发生此错误吗?

我做错了什么吗?

如果我做错了什么,导入本地包/方法的正确方法(或良好做法)是什么?

感谢您的见识。

---编辑---

我没有以任何方式摆弄PYTHONPATH,而是从(香草的)Conda venv运行Python3。为了获得良好的效果,我还创建了一个新的文件结构,并将代码复制到新的空白文件中。这是为了确保目录中不会发生任何“有趣”的事情。

1 个答案:

答案 0 :(得分:0)

这个问题似乎非常简单,但是我确实注意到其他人为此感到困惑。

尽管我通过Baum mit Augen找到了问题的答案。

Baum mit Augen花了一些时间写this answer,它很有启发性并且写得很好。

所以总结一下我的问题: 在开发中,我试图通过从终端启动bar.py来调用函数。这意味着bar是 main ,但位于包子目录中。这会导致导入错误,因为“其名称不会显示它在包装中”。

我只想强调与我的问题无关的两件事:

  1. 考虑到我找到此答案的帖子,这不是一个简单的问题。仅供参考:我与Python开发人员进行了快速交谈,该开发人员找不到合适的词向我解释。
  2. 我发现令人难以置信的是,那些寻求有效问题帮助的人基本上都可以回答“ RTFM”(arch-linux风格)。我真的很可惜。