【问题标题】:Python error: AttributeError: 'module' object has no attributePython 错误:AttributeError:“模块”对象没有属性
【发布时间】:2011-06-19 18:33:10
【问题描述】:

我对 Python 完全陌生,我知道这个问题被问过很多次,但不幸的是,我的情况似乎有点不同...... 我已经创建了一个包(或者我认为)。目录树是这样的:

mydir
    lib   (__init__.py)
        mod1  (__init__.py, mod11.py)

括号中是目录中的文件。 __init__.py 两个文件的长度都是零。

文件mydir/lib/mod1/mod11.py 包含以下内容:

def mod12():
    print "mod12"

现在,我运行python,然后运行import lib,运行正常,然后运行lib.mod11()lib.mod12()

最后两个中的任何一个都给了我主题错误消息。实际上,第 2 步之后的dir(lib) 也不会显示mod11mod12。 看来我错过了一些非常简单的东西。

(我在 Ubuntu 10.10 中使用 Python 2.6)

谢谢

【问题讨论】:

  • 主题中的错误信息不完整。在正文中发布完整的错误消息可能会有所帮助。

标签: python package


【解决方案1】:

我的做法是将 __ init__.py 文件留空,然后:

import lib.mod1.mod11
lib.mod1.mod11.mod12()

from lib.mod1.mod11 import mod12
mod12()

你可能会发现 mod1 目录是不必要的,只要在 lib 中有 mod12.py 即可。

【讨论】:

    【解决方案2】:

    当您import lib 时,您正在导入包。在这种情况下,唯一要评估和运行的文件是 lib 目录中的 0 字节 __init__.py

    如果您想访问您的函数,您可以执行类似from lib.mod1 import mod1 的操作,然后像mod1.mod12() 那样运行mod12 函数。

    如果您希望在导入lib 时能够访问mod1,则需要在__init__.py 目录下的__init__.py 文件中放置一个import mod1

    【讨论】:

      【解决方案3】:

      更准确地说,您的mod1lib 目录不是模块,它们是包。文件mod11.py 是一个模块。

      Python 不会自动导入子包或模块。您必须明确地这样做,或者通过在初始化程序中添加导入语句来“作弊”。

      >>> import lib
      >>> dir(lib)
      ['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
      >>> import lib.pkg1
      >>> import lib.pkg1.mod11
      >>> lib.pkg1.mod11.mod12()
      mod12
      

      另一种方法是使用from 语法将模块从包中“拉”到您的脚本命名空间中。

      >>> from lib.pkg1 import mod11
      

      然后将函数简单地引用为mod11.mod12()

      【讨论】:

        【解决方案4】:

        我的解决方案是将这些导入放在 lib 的 __init__.py 中:

        in file: __init__.py
        import mod1
        

        那么,

        import lib
        lib.mod1
        

        可以正常工作。

        【讨论】:

          猜你喜欢
          • 2017-01-31
          • 2015-03-09
          • 2013-07-05
          • 2018-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-25
          相关资源
          最近更新 更多