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

57 投票
4 回答
154808 浏览
提问于 2025-04-16 11:04

我刚接触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()

这两个命令都给我报错。实际上,在第二步之后,如果我输入dir(lib),也看不到mod11mod12

看起来我漏掉了什么很简单的东西。

(我在Ubuntu 10.10上使用Python 2.6)

谢谢

4 个回答

6

我会这样做:把 __ init__.py 文件留空,然后这样写:

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

或者

from lib.mod1.mod11 import mod12
mod12()

你可能会发现 mod1 这个文件夹其实没必要,可以直接把 mod12.py 放在 lib 里。

32

更准确地说,你的 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() 来调用这个函数。

49

当你使用 import lib 时,其实是在引入一个包。这个时候,唯一会被执行的文件是 lib 目录下的一个 0 字节的 __init__.py 文件。

如果你想使用你的函数,可以这样做 from lib.mod1 import mod1,然后像这样运行 mod1.mod12() 函数。

如果你希望在导入 lib 的时候就能直接使用 mod1,你需要在 lib 目录下的 __init__.py 文件里加上 import mod1

撰写回答