私の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__':
_ブロックでラップすると、同じ結果が得られます。この問題の原因は何ですか?
app
ディレクトリの名前を別の名前(例:webapp
)に変更することで、この問題を修正しました。 from webapp import app
を使用するとうまくいきます。これは、 インポート時にパッケージディレクトリ名がモジュール名よりも優先される であるためと思われます。おそらく、__path__
を使用すると、これを回避できます。
アプリの以下の行で同じ問題に直面していましたが、
import app.main.constant.constants as Constants
しかし、それから私は上のコマンドを下に再構築しました、そしてそれは私のために働きました。
from app.main.constant import constants as Constants
アプリをインポートするときに.
を削除し、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
ファイルがある場合は、それらも削除してみてください。