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

Ale*_*lex 36 python package

我是Python的新手,我知道这个问题被多次询问,但不幸的是,我的情况似乎有点不同......我创建了一个包(或者我认为).目录树是这样的:

mydir
    lib   (__init__.py)
    mod1  (__init__.py, mod11.py)
Run Code Online (Sandbox Code Playgroud)

在括号中,目录中有文件.两个__init__.py文件都是零长度.该文件mydir/lib/mod1/mod11.py包含以下内容:

def mod12():
    print "mod12"
Run Code Online (Sandbox Code Playgroud)

现在,我跑python,然后import lib,哪个工作正常,然后lib.mod11()lib.mod12().最后两个中的任何一个都给出了主题错误消息.实际上dir(lib)在步骤2之后没有显示mod11或者mod12任何一个.我似乎错过了一些非常简单的事情.(我在Ubuntu 10.10中使用Python 2.6)

谢谢

Nou*_*him 32

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

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

如果您希望能够访问mod1当您导入lib,你需要把import mod1里面__init__.py的内部文件lib目录.


Kei*_*ith 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
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用from语法将包中的模块"拉"到脚本命名空间中.

>>> from lib.pkg1 import mod11
Run Code Online (Sandbox Code Playgroud)

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


Gar*_*rwe 5

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

import lib.mod1.mod11
lib.mod1.mod11.mod12()
Run Code Online (Sandbox Code Playgroud)

要么

from lib.mod1.mod11 import mod12
mod12()
Run Code Online (Sandbox Code Playgroud)

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