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

16 浏览
0 Comments

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

我已经阅读了关于解决方法的内容(添加到sys.path更健壮的解决方案),但其他库并没有使用这样的解决方法(例如,tf中的这个文件)。我也不指望一定要这样做,我希望能够在一行代码中导入并运行 - 我一定是漏掉了什么!\n


\n具体来说,我有一个目录结构如下:\n

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

\n我期望在bar.py中可以简单地写上from foo import boo,然而我的IDE,PyCharm,将其视为错误。\n所以,相信我的IDE,我尝试了from src.foo import boo,但结果是一个ImportError,如下所示:\n

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

\n我验证了src文件夹在sys.path[0],然而将__file__插入到它似乎解决了这个问题 - 但我仍然不想使用这个解决方法,只能作为最后的手段。\n我尝试了很多其他方法来解决这个问题,但都没有成功。\n我如何在不使用这些解决方法的情况下导入一个本地模块?

0
0 Comments

在Python中导入本地模块时出现ImportError: No module named *的问题通常有以下原因和解决方法。

首先,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路径中。然而,如果从其他任何地方调用它,就会出现问题。编辑foo_1.py,添加一行代码"import src.bar"。直接运行foo_1.py(CWD为project/)时,bar.py将无法找到foo_2。

对于任何将使用您的软件包但不使用project/src作为CWD的人来说,这是一个严重的问题。

解决方法是按照标准做法,将源文件夹命名为分发的名称。假设'src'是您的分发名称,那么bar.py应该这样写:

import src.foo_2

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

#noinspection PyUnresolvedReferences
import foo

这些是解决在Python中导入本地模块时出现ImportError的常见原因和解决方法。

0
0 Comments

这个问题的原因是PyCharm中的一个错误。尽管PyCharm报错了,但是使用from foo import bar是正确的,并且会按预期工作。PyCharm声称src是一个模块应该引起我们的警惕。

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

为了防止PyCharm将来误导我们,我们需要禁用“未解决的引用”检查。可以在设置中搜索“未解决的引用”,然后禁用Python检查。

如果你看到这个答案,请确保查看Gangemi的答案,它更全面,并包括了只禁用PyCharm警告的方法。

![](https://i.stack.imgur.com/c4amn.png)

0