Python:AttributeError模块x没有属性y

Aks*_*tap 3 python module python-module python-3.x pipenv

我有一个目录结构如下的项目

.
??? Pipfile
??? Pipfile.lock
??? module
?   ??? __init__.py
?   ??? helpers
?   ?   ??? __init__.py
?   ?   ??? __pycache__
?   ?   ?   ??? __init__.cpython-36.pyc
?   ?   ??? dynamo.py
?   ?   ??? logger.py
?   ??? test.py
Run Code Online (Sandbox Code Playgroud)

相关代码

logger.py

import click
import sys
from tabulate import tabulate


def formatter(string, *rest):
    return string.format(*rest)


def info(*rest):
    """Write text in blue color
    """
    click.echo(click.style('? ' + formatter(*rest), fg='blue'))
Run Code Online (Sandbox Code Playgroud)

test.py

import helpers

helpers.logger.info('Trying')
Run Code Online (Sandbox Code Playgroud)

当我尝试使用命令运行

python3 module/test.py
Run Code Online (Sandbox Code Playgroud)

我得到这个错误

Traceback (most recent call last):
  File "module/test.py", line 4, in <module>
    helpers.logger.info('Trying')
AttributeError: module 'helpers' has no attribute 'logger'
Run Code Online (Sandbox Code Playgroud)

我曾尝试重新编写代码。将helpers目录放在目录之外module。但是从我所读的内容来看,它仍然行不通,不应该这样做。我尝试研究有关__init__.pypython模块系统的知识。我读得越多,就会越困惑。但是从我学到的东西,我创建了另一个示例项目。具有以下结构,

.
??? test
    ??? __init__.py
    ??? helpers
    ?   ??? __init__.py
    ?   ??? __pycache__
    ?   ?   ??? __init__.cpython-36.pyc
    ?   ?   ??? quote.cpython-36.pyc
    ?   ??? quote.py
    ??? index.py
    ??? logger
    ?   ??? __init__.py
    ?   ??? __pycache__
    ?   ?   ??? __init__.cpython-36.pyc
    ?   ?   ??? info.cpython-36.pyc
    ?   ??? info.py
Run Code Online (Sandbox Code Playgroud)

代码与第一个项目相同。

我来的时候

python3 test/index.py
Run Code Online (Sandbox Code Playgroud)

它按预期工作。只有这两个项目之间的区别:

在第一个项目中,我曾经pipenv安装过deps和创建虚拟环境。

bru*_*ers 6

使用您的初始布局(有loggers作为的一个子模块helpers包),你需要明确地导入loggers在helpers/__init__.py它暴露的的属性helpers包:

# helpers/__init__.py
from . import logger
Run Code Online (Sandbox Code Playgroud)


Dhi*_*aTN 5

logger是模块而不是属性,并且helpers.logger评估logger为属性。实际上,您应该执行以下操作:

from helpers import logger

print(logger.info('Trying'))
Run Code Online (Sandbox Code Playgroud)