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