Python Eclipse PyDev 中自己的包的 ImportError / ModuleNotFoundError

Python ImportError / ModuleNotFoundError on own package in Eclipse PyDev

已解决,谢谢!

假设我在 C:\mymodules\general 下有一个自己编写的模块,其中包含文件 foo.py__init__.py.

现在我想将位于 foo.py 内的函数 bar() 导入到一个完全不同位置的脚本中。

为什么这不起作用?

import sys
sys.path.append(r"C:\mymodules")
from general import foo

foo.bar()

我得到ImportError: cannot import name 'foo'

如果我将 C:\mymodules\general 添加到路径,则相同。

或者,我也试过

import sys
sys.path.append(r"C:\mymodules")
import general.foo

foo.bar()

在这里,我得到 ModuleNotFoundError: No module named 'general.foo'; 'general' is not a package

为什么一般不会是包?我认为要求是 "contains an __init__.py"(当然还有我要导入的模块)?

这就是全部Python3,在Windows7下使用Eclipse中的PyDev。

谁能告诉我哪里出了问题以及如何解决?


编辑: 文件确实已经被调用 __init__.py,所以这不是问题所在。

__init__.py 已经包含行

__all__ = ["foo"]

编辑 2: 奇怪的是,以下作品:

import sys
sys.path.append(r"C:\mymodules")
from general import *
bar()

不过我真的不想 import *。一定有更清洁的方法吗?


编辑 3: 当我从 IDLE 中 运行 它时,它起作用了! (即第一个代码。)但是在 Eclipse PyDev 中,我仍然遇到相同的错误。为什么?

啊!找到解决方案! (请参阅下面的答案,以关闭它)。

当使用 init 文件时,它必须像 Robin Zigmond 所说的那样带有下划线。

__init__.py

如果这对您不起作用,您可以尝试在 init 文件中写入

 from foo import bar

 from foo.py import *

Look here

已找到解决方案。 总台

在 PyDev 的 Pythonpath(为整个工作区配置)中,我有另一个包含名为 general.py模块 的包。解释器在到达我的 package general 之前发现了这个,所以消息 general is not a package 引用了 module同名。

这应该教会我在确实需要重用现有名称时使用单独的工作区。理想情况下,无论如何不要对不同的事物使用相同的名称。