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

56

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

谢谢


2
主题中的错误信息不完整。在正文中发布完整的错误信息可能会有所帮助。 - Keith
4个回答

48

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

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

如果你想在导入lib时访问mod1,你需要在lib 目录内的__init__.py 文件中放置一个import mod1


我尝试在lib/__init__.py中添加import mod1。当我导入lib时,出现了一个错误ModuleNotFoundError: No module named 'mod1' - undefined

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


6
我会留空 __init__.py 文件并执行以下操作:
import lib.mod1.mod11
lib.mod1.mod11.mod12()

或者

from lib.mod1.mod11 import mod12
mod12()

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

4
我的解决方案是将那些import语句放在lib的__init__.py文件中:
in file: __init__.py
import mod1

然后,
import lib
lib.mod1

会很好用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接