【发布时间】:2018-10-15 21:55:22
【问题描述】:
对不起,如果这个问题看起来很简单,我在 java 方面很有经验,但在 python 方面绝对不是,而且导入在 python 中的工作方式对我来说仍然是一个谜。
问题在于,从我从互联网上收集的内容来看,我觉得我已经完成了我的脚本在文件夹中导入模块所需的一切。
我的项目是这样的
/omme
start.py
/foo
__init__.py #is empty
bar.py #has a class named BarClass
start.py 只有这个
from foo.bar import BarClass
b = BarClass()
当我在 spyder IDE 中运行这个脚本时,我得到了这个
runfile('/home/nathan/Documents/workspace/omme/start.py', wdir='/home/nathan/Documents/workspace/omme')
Reloaded modules: foo.bar
Traceback (most recent call last):
File "<ipython-input-38-c3b9ba6593fb>", line 1, in <module>
runfile('/home/nathan/Documents/workspace/omme/start.py', wdir='/home/nathan/Documents/workspace/omme')
File "/home/nathan/.anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 705, in runfile
execfile(filename, namespace)
File "/home/nathan/.anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 102, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "/home/nathan/Documents/workspace/omme/start.py", line 1, in <module>
from foo.bar import BarClass
ImportError: cannot import name 'BarClass'
然后更奇怪的是,如果我将 foo.bar 替换为 test.bar 它会引发 ModuleNotFoundException(我怀疑是一些 ide 恶作剧)。
我做错了什么?
感谢您的宝贵时间,内森。
【问题讨论】:
-
试试
import foo.bar,然后是print(foo.bar)和print(dir(foo.bar)),看看你实际导入了什么。 -
@zvone 它分别给了我:
<module 'foo.bar' from '/home/nathan/Documents/workspace/omme/foo/bar.py'>和Reloaded modules: foo.bar ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'barClass'] -
看起来你的班级被命名为
barClass而不是BarClass。 -
@zvone 你是对的,我为这样一个愚蠢的错误感到尴尬......谢谢你的耐心。有趣的是,如果
foo.bar被替换为test.bar它将停止工作。但无论如何,我只是避免创建名为 test.xml 的文件夹。另一方面:你认为我应该删除这个问题,因为答案是如此公然普遍吗? -
是的,我认为你应该删除这个问题 :) 无论如何,
test问题可能更有趣,但也可以尝试import test; print(test)- 你可能还有其他一些test模块闲逛
标签: python class import module spyder