【发布时间】:2019-07-02 16:59:55
【问题描述】:
已解决,谢谢!
假设我有一个位于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。
为什么general 不是一个包?我认为要求是“包含__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__.py- 两边各有2个下划线 -
@RobinZigmond 已经是了,只是在文本中说错了,抱歉。修好了。
-
在
general上方的根目录添加__init__.py -
@YugandharChaudhari 没用,结果相同。 (此外,将答案放入答案而不是 cmets 将有助于整个赞成/反对/接受业务的运作。)
-
是的,但只有在我们非常确定的情况下我们才应该回答:) 并且
__init__.py对我来说是空的。告诉解释器将目录和文件视为模块
标签: python python-3.x eclipse import pydev