web-dev-qa-db-ja.com

Flask AttributeError:module'app 'には属性' run 'があ​​りません

私のFlaskプロジェクトは次のように構成されています:

_my_project
│
├── app
│   ├── __init__.py
│   ├── api
│   ├── static
│   └── templates
├── config.py
└── run.py
_

app/__ init __。py

_from flask import Flask

app = Flask(__name__)

app.config.from_object('config')
_

run.py

_from app import app

app.run(
    Host=app.config.get('Host', '0.0.0.0'),
    port=app.config.get('PORT', 5000)
)
_

これは以前は機能していましたが、プロジェクトをPython 2からPython 3に移行しようとしていますが、_python run.py_の実行は機能しなくなりました。次のエラーが発生します。

_Traceback (most recent call last):
  File "/Users/rasmi/Projects/my_project/run.py", line 3, in <module>
    app.run(
AttributeError: module 'app' has no attribute 'run'
_

_run.py_のインポートスタイルを1つに一致するように変更した場合 ここ

_from .app import app

app.run(
    Host=app.config.get('Host', '0.0.0.0'),
    port=app.config.get('PORT', 5000)
)
_

別のエラーが発生します:

_Traceback (most recent call last):
  File "/Users/rasmi/Projects/my_project/run.py", line 1, in <module>
    from .app import app
ModuleNotFoundError: No module named '__main__.app'; '__main__' is not a package
_

app.run()呼び出しを_if __name__ == '__main__':_ブロックでラップすると、同じ結果が得られます。この問題の原因は何ですか?

4
rasmi

appディレクトリの名前を別の名前(例:webapp)に変更することで、この問題を修正しました。 from webapp import appを使用するとうまくいきます。これは、 インポート時にパッケージディレクトリ名がモジュール名よりも優先される であるためと思われます。おそらく、__path__を使用すると、これを回避できます。

4
rasmi

アプリの以下の行で同じ問題に直面していましたが、

import app.main.constant.constants as Constants

しかし、それから私は上のコマンドを下に再構築しました、そしてそれは私のために働きました。

from app.main.constant import constants as Constants
0
Omkar

アプリをインポートするときに.を削除し、if __== '__main__':でアプリを実行します。

run.py

from app import app

if __== '__main__':
    app.run(
        Host=app.config.get('Host', '0.0.0.0'),
        port=app.config.get('PORT', 5000)
    )

コマンドライン

my_project$ python run.py

また、virtualenvを使用している場合は、目的のPythonを使用していることを確認してください。

my_project$ which python; python --version

*.pycファイルがある場合は、それらも削除してみてください。

0
Dušan Maďar