2017-12-14 21 views
1

私はPythonの:

. 
├── Pipfile 
├── Pipfile.lock 
├── module 
│   ├── __init__.py 
│   ├── helpers 
│   │   ├── __init__.py 
│   │   ├── __pycache__ 
│   │   │   └── __init__.cpython-36.pyc 
│   │   ├── dynamo.py 
│   │   └── logger.py 
│   └── test.py 

Relavantコードの下

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

のようなディレクトリ構造を持つプロジェクトがあり、YはAttributeErrorモジュールxは何の属性を持っていませんtest.py

私は、コマンドに

python3 module/test.py 

を使用して実行しようとすると、私は

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

このエラーを取得する

import helpers 

helpers.logger.info('Trying') 

私は、コードを再構築しようとしています。 helpersディレクトリを外部に置き、moduleディレクトリのレベルにします。しかしそれでも、それは私が読んだものから、それは持ってはならない、うまくいきませんでした。私は__init__.pyとPythonモジュールシステムについて少し調べてみました。私が読むほど、それはより混乱します。しかし、私が学んだことから、別のサンプルプロジェクトを作成しました。以下の構造では、

. 
└── 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 

コードは最初のプロジェクトと同じです。期待どおりに動作します

ここ

私は、

python3 test/index.py 

。 2つのプロジェクトの唯一の違い:

最初のプロジェクトでは、pipenvを使用してdepsをインストールし、仮想環境を作成しました。

+1

これはPythonパッケージのインポートの仕組みではありません。 'logger'を使いたい場合は、明示的にインポートする必要があります。最も良い方法は 'from helpers import logger'と' logger.info(...) 'を使うことです。しかし、stdlibから 'logging'モジュールを使ってこれをやっていないことも考慮する必要があります。 –

答えて

3

loggerモジュールであり、属性としてlogger属性とhelpers.logger evalutesません。実際にあなたが次のように実行する必要があります。

from helpers import logger 

print(logger.info('Trying')) 
+1

ありがとう、それは動作します。 –

2

helpersパッケージのサブモジュールとしてloggers付き)あなたの初期レイアウトを使用して、helpersパッケージの属性として、それを公開するために明示的にhelpers/__init__.pyloggersをインポートする必要があるだろう:

# helpers/__init__.py 
from . import logger