在Python中导入本地模块 - ImportError:不是名为*的模块

时间:2017-11-15 08:31:09

标签: python import pycharm python-import importerror

我在看似简单的任务中度过了许多夜晚 - 如何在Python中导入本地模块?

我已阅读过有关变通办法(adding to sys.pathmore robust solutions),但其他图书馆未使用此类变通办法(例如,{{ 3)} 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__似乎确实解决了问题 - 我仍然不想使用此解决方法,但作为最后的手段。

我已经尝试了其他一百万种技巧,但却没有成功。

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

2 个答案:

答案 0 :(得分:2)

此问题是由PyCharm中的错误引起的。使用from foo import bar的初始本能是正确的,尽管PyCharm假定错误,但仍可正常工作。它声称src是一个模块的事实应该引起我的警觉。

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

为了阻止PyCharm在将来误导我们,我们必须禁用“未解决的参考资料”。检查。这可以通过搜索未解析的参考文献来完成。在“设置”中并禁用Python检查。

this file

答案 1 :(得分:1)

这里有几件事情,所以让我们把它分解。

上层foo目录模糊了Pycharms解析顺序。让我们试试这个结构:

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

默认情况下,Pycharm假定项目/在分辨率顺序中具有优先权。在我的示例中,如果您开始在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 Path。但是,请从其他任何地方拨打电话,然后再遇到麻烦。编辑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