Python错误:AttributeError:'module'对象没有属性

时间:2011-02-02 06:22:25

标签: python package

我是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)

谢谢

4 个答案:

答案 0 :(得分:31)

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

如果您想要访问自己的功能,可以执行类似from lib.mod1 import mod1之类的操作,然后像mod12一样运行mod1.mod12()功能。

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

答案 1 :(得分:23)

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

Python不会自动导入子包或模块。您必须明确地执行此操作,或通过在初始化程序中添加import语句来“欺骗”。

>>> 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()

答案 2 :(得分:5)

我这样做的方法是将__ init__.py文件留空,并执行:

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

from lib.mod1.mod11 import mod12
mod12()

您可能会发现mod1目录是不必要的,只需在lib中使用mod12.py。

答案 3 :(得分:4)

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

in file: __init__.py
import mod1

然后,

import lib
lib.mod1

会正常工作。