【问题标题】:module has no attribute模块没有属性
【发布时间】:2012-01-17 17:44:20
【问题描述】:

我有一个目录,其中包含许多 .py 文件。每个文件都定义了一些类。我的目录中还有一个空的__init__.py

例如:

myproject
    __init__.py
    mymodule
        __init__.py
        api.py
        models.py
        views.py

我正在尝试导入 mymodule 并访问所有这些文件中定义的类:

from myproject import mymodule

print mymodule.api.MyClass 

它给了我一个错误,说mymodule 没有属性api。为什么?为什么我只能访问其中一个文件 (models.py) 而不能访问其他文件?

In [2]: dir(banners)
Out[2]:
['__builtins__',
 '__doc__',
 '__file__',
 '__name__',
 '__package__',
 '__path__',
 'models']

【问题讨论】:

    标签: python


    【解决方案1】:

    问题是子模块不会自动导入。您必须显式导入 api 模块:

    import myproject.mymodule.api
    print myproject.mymodule.api.MyClass
    

    如果您真的坚持在导入myproject.mymoduleapi 可用,您可以将其放入myproject/mymodule/__init__.py

    import myproject.mymodule.api
    

    然后这将按预期工作:

    from myproject import mymodule
    
    print mymodule.api.MyClass 
    

    【讨论】:

    • 嗨,我试过了,但我仍然收到 ModuleNotFoundError:没有名为 lib.myfunction 的模块。有什么想法吗?有趣的是,如果我只是导入 lib,就没有错误。如果我之后调用 lib.myfunction,它也会引发错误。
    • 这样是不是有点麻烦?有没有办法默认打开子模块的导入(具有完整的限定名称,例如 foo.bar.baz)?
    • 我可以完全导入,但在其余代码中我想删除myproject 并参考mymodule.api,这似乎是不可能的?
    【解决方案2】:

    如果你像我一样是个白痴,那么还要检查你是否没有将你的 python 文件命名为与你尝试导入的模块相同的名称。

    【讨论】:

    • 是的,这是一条奇怪的 Python 规则,文件名必须与模块名不同。被警告!
    • 哇哦,google 好难啊!
    【解决方案3】:

    模块不是这样工作的。

    from myproject.mymodule import api
    print api.MyClass
    

    【讨论】:

    • 我知道我能做到。是否可以使用虚线名称?
    • @akonsu,然后只需执行import myproject.mymodule.api 并通过myproject.mymodule.api.MyClass 访问它。
    • 嗯,我认为这是一个关于语言的问题,而不是关于如何让我的代码工作的问题。我很好奇这是否可以实现。我可以让它通过 'mymodule.api...' 访问我的课程,而不需要领先的 'myproject' 吗?
    • 你可以做import myproject.mymodule as mymodule,但我觉得很困惑
    【解决方案4】:

    在 myproject 目录中也需要一个 __init__.py。所以你的模块结构应该是:

    myproject
        __init__.py
        mymodule
            __init__.py
            api.py
            models.py
            views.py
    

    【讨论】:

    • 这正是问题中的模块结构......
    猜你喜欢
    • 2020-06-04
    • 2021-12-24
    • 2015-05-08
    • 2020-10-17
    • 2020-10-03
    • 2018-08-11
    • 2020-01-01
    • 2018-04-14
    • 2020-06-05
    相关资源
    最近更新 更多