【问题标题】:python import class in module throws ImportError模块中的python导入类抛出ImportError
【发布时间】: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 它分别给了我:&lt;module 'foo.bar' from '/home/nathan/Documents/workspace/omme/foo/bar.py'&gt;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


【解决方案1】:

感谢@zvone,我现在知道我的错误了:我只是拼错了班级的名称...对不起您的时间。

由于我无法删除问题,我将告诉您@vzone 告诉我解决我遇到的两个问题的简单技巧:

import lib
print (lib)

让您检查 lib 所在的位置,因为您可能正在从其他地方加载类似名称的 lib。我的test.bar 发生在我身上
进一步使用

import lib
print (dir( lib))

让您对类中的内容有一个非常简洁的了解,从而更容易调试。

感谢小伙子,他在 cmets 做到了。

【讨论】:

    猜你喜欢
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 2017-06-11
    • 2018-10-10
    • 2019-06-18
    相关资源
    最近更新 更多