Import a local module in Python - ImportError: Not module named *

Import a local module in Python - ImportError: Not module named *

我已经阅读了解决方法(adding to sys.path or more robust solutions), but other libraries don't use such workarounds (for example, this file in tf)。我不希望我真的必须这样做,我希望能够在一行中导入并且 运行 - 我一定是遗漏了什么!


具体来说,我有类似以下目录的内容:

project/
  foo/
  src/
    __init__.py
    bar.py
    foo/
      __init__.py
      boo.py

我希望在 bar.py 中我可以简单地写一些类似 from foo import boo 的东西,但是我的 IDE、PyCharm 认为这是一个错误。

所以,相信我的 IDE,我尝试 from src.foo import boo 但这会导致 ImportError,经测试:

Traceback (most recent call last):
  File "bar.py", line 1, in <module>
    from src.foo import boo
ImportError: No module named 'src'

我确认 src 文件夹位于 sys.path[0],但是向其中插入 __file__ 似乎确实解决了问题 - 我仍然不想使用此解决方法,但最后会使用度假村。

我已经尝试了一百万种其他技巧来让它工作但没有成功。

如何在不使用其中一种解决方法的情况下从本地模块导入?

此问题是由 PyCharm 中的错误引起的。 使用 from foo import bar 的最初本能是正确的,尽管 [=25] 仍会按预期工作=] 假定的错误。它声称 src 是一个模块这一事实应该在我脑海中引起警报。

可以安全地忽略PyCharm警告,代码可以是运行。

为了阻止PyCharm 将来误导我们,我们将不得不禁用'Unresolved references' 检查。这可以通过在设置中搜索 'unresolved references' 并禁用 Python 检查来完成。

这里发生了一些事情,所以让我们分解一下。

上层 foo 目录混淆了 Pycharm 的解析顺序。让我们试试这个结构:

project/
  foo_1.py
  src/
    __init__.py
    bar.py
    foo_2.py

Pycharm,默认情况下,假定 project/ 在解析顺序中具有优先权。在我的示例中,如果您开始在 bar.py 中键入 "import f",Pycharm 的自动完成将建议 foo_1 而不是 foo_2。因此,当您导入 foo 时,Pycharm 假定它是顶级 foo 并且 boo 是不可解析的。

那么为什么 Pycharm 不假设 foo_2?

假设 bar.py 有这一行:

import foo_2

直接运行bar.py就可以了,因为Python将当前工作目录添加到Python路径。但是,从其他任何地方调用它都会遇到麻烦。编辑 foo_1.py 以包含这一行:

import src.bar

运行 foo_1.py 直接(这使得 CWD 项目/)和 bar.py 将无法找到 foo_2。 对于任何将使用您的软件包但不使用 project/src 作为 CWD 的人来说,这都是一个严重的问题,这将是每个人。

如何解决这个问题

标准做法是在分发后命名源文件夹。假设 'src' 是您的发行版名称,bar.py 应该这样做:

import src.foo_2

规则例外

我假设你在写一个包。如果 bar.py 是一个脚本,因此可能会被直接调用,那么您可以假设它每次都会成功,您应该只禁用对该行的检查:

#noinspection PyUnresolvedRefrences
import foo