【问题标题】:Import a local module in Python - ImportError: Not module named *在 Python 中导入本地模块 - ImportError: No module named *
【发布时间】:2017-11-15 08:31:08
【问题描述】:

我已经阅读了解决方法(adding to sys.pathmore robust solutions),但其他库不使用此类解决方法(例如,tf 中的this file)。我也不认为我真的必须这样做,我希望能够在一行上导入并运行 - 我一定是错过了什么!


具体来说,我有以下目录:

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__ 似乎确实解决了问题 - 我仍然不想使用此解决方法,但作为最后的手段。

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

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

【问题讨论】:

  • 您的示例可能不完整吗?我在 2017.2.4 pro 中看不到这个问题,它没有报告未解决的引用并建议正确的导入。无论如何,禁用检查对我来说似乎是一种极端的解决方法。
  • 我可能在几年前修改了设置以导致此问题。我专门升级到社区 2017.2.4 来尝试解决这个问题。如果检查显示为警告,我会保持启用状态 - 这是我的设置所设置的 - 但似乎另一个错误导致检查显示为错误。
  • 啊,好吧,可能是社区和专业之间的细微差别,甚至是您拥有的一些插件或自定义设置。我在这里有一个相当标准的开箱即用配置。

标签: python import pycharm python-import importerror


【解决方案1】:

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

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

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

【讨论】:

  • 如果您看到此答案,请务必查看@Guy Gangemi 的答案,它更全面,并且包括一种仅针对单行禁用 PyCharm 警告的方法
【解决方案2】:

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

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

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 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 2012-12-28
    • 2015-09-10
    • 2016-06-04
    • 2017-03-16
    • 1970-01-01
    相关资源
    最近更新 更多