在Python中导入本地模块 - ImportError: 没有名为*的模块
在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, infrom src.foo import boo ImportError: No module named 'src'
\n我验证了src文件夹在sys.path[0]
,然而将__file__插入到它似乎解决了这个问题 - 但我仍然不想使用这个解决方法,只能作为最后的手段。\n我尝试了很多其他方法来解决这个问题,但都没有成功。\n我如何在不使用这些解决方法的情况下导入一个本地模块?
在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的常见原因和解决方法。