質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.77%

Herokuへのデプロイ時にModuleNotFoundError

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 266

KazukiTanno

score 4

前提・実現したいこと

flaskでウェブアプリを作成し,herokuにデプロイしようとしています.
ディレクトリの構成は以下のようにしています.

/
├frontend
├backend
│  ├main.py
│  └api.py
│
├Pipfile
├Pipfile.lock
├Procfile
├requirements.txt
└rentime.txt


Herokuへのデプロイは問題なく行えたのですが,ブラウザで確認するとapplication errorとなっていました.
エラーメッセージから察するに,main.py内でapi.pyを呼び出している箇所が上手く動作していないようです.
自分でいくつか調べてみたのですが,解決方法がわからず,手詰まりとなっている状況です.

発生している問題・エラーメッセージ

heroku openでブラウザを起動すると,application errorとなり,heroku logs --tailを実行すると,下記のようなエラーが出ます.

2020-03-07T13:53:54.436052+00:00 heroku[web.1]: State changed from starting to crashed
2020-03-07T13:53:54.440596+00:00 heroku[web.1]: State changed from crashed to starting
2020-03-07T13:53:54.421252+00:00 heroku[web.1]: Process exited with status 3
2020-03-07T13:53:59.526616+00:00 heroku[web.1]: Starting process with command `gunicorn -b 0.0.0.0:43457 backend.main:app`
2020-03-07T13:54:01.996346+00:00 heroku[web.1]: State changed from starting to crashed
2020-03-07T13:54:01.549850+00:00 app[web.1]: [2020-03-07 13:54:01 +0000] [4] [INFO] Starting gunicorn 20.0.4
2020-03-07T13:54:01.550738+00:00 app[web.1]: [2020-03-07 13:54:01 +0000] [4] [INFO] Listening at: http://0.0.0.0:43457 (4)
2020-03-07T13:54:01.550846+00:00 app[web.1]: [2020-03-07 13:54:01 +0000] [4] [INFO] Using worker: sync
2020-03-07T13:54:01.554785+00:00 app[web.1]: [2020-03-07 13:54:01 +0000] [10] [INFO] Booting worker with pid: 10
2020-03-07T13:54:01.644973+00:00 app[web.1]: [2020-03-07 13:54:01 +0000] [11] [INFO] Booting worker with pid: 11
2020-03-07T13:54:01.717102+00:00 app[web.1]: [2020-03-07 13:54:01 +0000] [10] [ERROR] Exception in worker process
2020-03-07T13:54:01.717104+00:00 app[web.1]: Traceback (most recent call last):
2020-03-07T13:54:01.717105+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
2020-03-07T13:54:01.717105+00:00 app[web.1]: worker.init_process()
2020-03-07T13:54:01.717106+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/gunicorn/workers/base.py", line 119, in init_process
2020-03-07T13:54:01.717106+00:00 app[web.1]: self.load_wsgi()
2020-03-07T13:54:01.717106+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/gunicorn/workers/base.py", line 144, in load_wsgi
2020-03-07T13:54:01.717107+00:00 app[web.1]: self.wsgi = self.app.wsgi()
2020-03-07T13:54:01.717107+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/gunicorn/app/base.py", line 67, in wsgi
2020-03-07T13:54:01.717108+00:00 app[web.1]: self.callable = self.load()
2020-03-07T13:54:01.717108+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 49, in load
2020-03-07T13:54:01.717108+00:00 app[web.1]: return self.load_wsgiapp()
2020-03-07T13:54:01.717109+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 39, in load_wsgiapp
2020-03-07T13:54:01.717109+00:00 app[web.1]: return util.import_app(self.app_uri)
2020-03-07T13:54:01.717110+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/gunicorn/util.py", line 358, in import_app
2020-03-07T13:54:01.717110+00:00 app[web.1]: mod = importlib.import_module(module)
2020-03-07T13:54:01.717110+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/importlib/__init__.py", line 127, in import_module
2020-03-07T13:54:01.717111+00:00 app[web.1]: return _bootstrap._gcd_import(name[level:], package, level)
2020-03-07T13:54:01.717111+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
2020-03-07T13:54:01.717112+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 983, in _find_and_load
2020-03-07T13:54:01.717112+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
2020-03-07T13:54:01.717113+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
2020-03-07T13:54:01.717113+00:00 app[web.1]: File "<frozen importlib._bootstrap_external>", line 728, in exec_module
2020-03-07T13:54:01.717113+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
2020-03-07T13:54:01.717114+00:00 app[web.1]: File "/app/backend/main.py", line 4, in <module>
2020-03-07T13:54:01.717114+00:00 app[web.1]: from api import get_user_bp, login_bp, mypage_init_bp, data_update_bp
2020-03-07T13:54:01.717119+00:00 app[web.1]: ModuleNotFoundError: No module named 'api'
2020-03-07T13:54:01.717268+00:00 app[web.1]: [2020-03-07 13:54:01 +0000] [10] [INFO] Worker exiting (pid: 10)
2020-03-07T13:54:01.844003+00:00 app[web.1]: [2020-03-07 13:54:01 +0000] [11] [ERROR] Exception in worker process
2020-03-07T13:54:01.844024+00:00 app[web.1]: Traceback (most recent call last):
2020-03-07T13:54:01.844025+00:00 app[web.1]: File 


ModuleNotFoundError: No module named 'api'とあることから,おそらくmain.py内で自作モジュールapi.pyを上手く呼び出すことが出来ていないのだと思います.

該当のソースコード

main.pyでは,以下のコードでapi.pyをインポートしています.

from flask import Flask, render_template
from api import get_user_bp, login_bp, mypage_init_bp, data_update_bp


Pipfile

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
flask = "*"
gunicorn = "*"
pyrebase = "*"
flask-restful = "*"

[requires]
python_version = "3.7"

[scripts]
start = "python backend/main.py"

Procfile

web: gunicorn -b 0.0.0.0:$PORT backend.main:app

requirements.txt

aniso8601==8.0.0
Click==7.0
Flask==1.1.1
Flask-RESTful==0.3.8
gcloud==0.17.0
googleapis-common-protos==1.51.0
gunicorn==20.0.4
httplib2==0.17.0
itsdangerous==1.1.0
Jinja2==2.11.1
jws==0.1.3
MarkupSafe==1.1.1
oauth2client==3.0.0
protobuf==3.11.3
pyasn1==0.4.8
pyasn1-modules==0.2.8
pycryptodome==3.4.3
Pyrebase==3.0.27
python-jwt==2.0.1
pytz==2019.3
requests==2.11.1
requests-toolbelt==0.7.0
rsa==4.0
six==1.14.0
Werkzeug==1.0.0

runtime.txt

python-3.7.5

試したこと

  • main.pyapi.pyを呼び出す部分を除いたコードをデプロイした際は,問題なくアプリケーションがweb上で確認することが出来ました.
  • localでは,api.pyの呼び出しも含め,何もエラーは出ていません.

補足情報(FW/ツールのバージョンなど)

  • Heroku: Freeアカウント
  • ローカル環境:python3.7.5
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

Procfileを以下のように書き換えることで解決しました.

web: gunicorn -b 0.0.0.0:$PORT --pythonpath backend backend.main:app

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る