Python错误:AttributeError:'module'对象没有此属性
我刚接触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)
,也看不到mod11
或mod12
。
看起来我漏掉了什么很简单的东西。
(我在Ubuntu 10.10上使用Python 2.6)
谢谢
4 个回答
我会这样做:把 __ init__.py 文件留空,然后这样写:
import lib.mod1.mod11
lib.mod1.mod11.mod12()
或者
from lib.mod1.mod11 import mod12
mod12()
你可能会发现 mod1 这个文件夹其实没必要,可以直接把 mod12.py 放在 lib 里。
更准确地说,你的 mod1
和 lib
文件夹不是模块,它们是包。文件 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()
来调用这个函数。
当你使用 import lib
时,其实是在引入一个包。这个时候,唯一会被执行的文件是 lib 目录下的一个 0 字节的 __init__.py
文件。
如果你想使用你的函数,可以这样做 from lib.mod1 import mod1
,然后像这样运行 mod1.mod12()
函数。
如果你希望在导入 lib
的时候就能直接使用 mod1
,你需要在 lib
目录下的 __init__.py
文件里加上 import mod1
。