Приложение Flask не может найти модуль при развертывании в Azure - локально работает нормально - PullRequest
0 голосов
/ 29 мая 2019

Azure выдает ошибку импорта модуля, но тот же код работает локально.

2019-05-29T02:50:47.388004719Z: [ERROR]  Traceback (most recent call last):
2019-05-29T02:50:47.388027419Z: [ERROR]    File "/usr/local/lib/python3.6/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
2019-05-29T02:50:47.388031719Z: [ERROR]      worker.init_process()
2019-05-29T02:50:47.388035419Z: [ERROR]    File "/usr/local/lib/python3.6/site-packages/gunicorn/workers/base.py", line 129, in init_process
2019-05-29T02:50:47.388039419Z: [ERROR]      self.load_wsgi()
2019-05-29T02:50:47.388043019Z: [ERROR]    File "/usr/local/lib/python3.6/site-packages/gunicorn/workers/base.py", line 138, in load_wsgi
2019-05-29T02:50:47.388047119Z: [ERROR]      self.wsgi = self.app.wsgi()
2019-05-29T02:50:47.388050819Z: [ERROR]    File "/usr/local/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi
2019-05-29T02:50:47.388054619Z: [ERROR]      self.callable = self.load()
2019-05-29T02:50:47.388075019Z: [ERROR]    File "/usr/local/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 52, in load
2019-05-29T02:50:47.388084919Z: [ERROR]      return self.load_wsgiapp()
2019-05-29T02:50:47.388088619Z: [ERROR]    File "/usr/local/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 41, in load_wsgiapp
2019-05-29T02:50:47.388092219Z: [ERROR]      return util.import_app(self.app_uri)
2019-05-29T02:50:47.388095619Z: [ERROR]    File "/usr/local/lib/python3.6/site-packages/gunicorn/util.py", line 350, in import_app
2019-05-29T02:50:47.388099119Z: [ERROR]      __import__(module)
2019-05-29T02:50:47.388102419Z: [ERROR]    File "/home/site/wwwroot/app.py", line 102, in <module>
2019-05-29T02:50:47.388106219Z: [ERROR]      from views.auth import register_user_bp, user_login_bp, user_logout_bp
2019-05-29T02:50:47.388109619Z: [ERROR]    File "/home/site/wwwroot/views/auth.py", line 4, in <module>
2019-05-29T02:50:47.388113619Z: [ERROR]      from Forms import *
2019-05-29T02:50:47.388116919Z: [ERROR]  ModuleNotFoundError: No module named 'Forms'

Кажется, я нашел один из моих пользовательских модулей, но не тот, который находится в корневом каталоге из подкаталога.Однако, похоже, что он успешно импортирует Config.py из app.py, которые находятся в корневом каталоге.

Программа запускается из app.py в корневом каталоге, если это важно

Я думаю, что в том, как работает gunicorn / WSGI, есть что-то, чего я не понимаю.Я не могу понять, что меняет поведение импорта.

project_root
├── app.py
├── Config.py
├── Forms.py
├── __init__.py
├── manage.py
├── migrations
├── Models.py
├── requirements.txt
├── static
├── templates
│   ├── change_profile.html
│   ├── dash_app_layout.py
│   ├── default_login.html
│   ├── default_logout.html
│   ├── _formhelpers.html
│   ├── header.html
│   ├── index.html
│   ├── __init__.py
│   ├── nav_layout.py
│   ├── record_meeting.html
│   ├── register_user.html
│   ├── upload_meeting.html
│   └── voice_enroll.html
├── utils
│   ├── audio_processor
│   │   ├── AudioProcessor.py
│   │   ├── audio_type_converter.py
│   │   ├── Deidentifier.py
│   │   ├── Identification
│   │   ├── __init__.py
│   │   ├── Utterance.py
│   │   └── voice_enroll.py
│   ├── db_operations.py
│   ├── __init__.py
│   ├── interim_result_processor.py
│   └── utils.py
└── views
    ├── auth.py
    ├── dash_callbacks.py
    ├── __init__.py
    ├── meeting_upload.py
    ├── profile.py
    └── record_meeting.py

Я не уверен, почему он работает локально, но не могу импортировать из Forms.py в веб-приложении.Я почти уверен, что это как-то связано со структурой файла, но я не могу понять, что и как исправить.

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Я попытался воспроизвести вашу проблему, но потом обнаружил, что проблема, возможно, была вызвана отсутствием пути вашего проекта в sys.path.

Я предполагаю, что вы разработали локально в виртуальной среде Python, поэтому sys.path будет автоматически включать путь к вашему проекту, когда вы даете команду source <project_root>/bin/active, чтобы включить виртуальную среду. Но без виртуальной среды ваш путь к проекту не будет импортирован по умолчанию в sys.path системной среды выполнения Python.

Таким образом, решение заключается в том, что вы можете вручную добавить /home/site/wwwroot к sys.path, добавив новую строку кода в app.py, как показано ниже.

from flask import Flask

import sys
sys.path.append('/home/site/wwwroot')

# Then you can normally import Forms module
from Forms import *
0 голосов
/ 29 мая 2019

Попробуйте переместить Forms.py в папку views или
добавить эти две строки в auth.py
import sys
sys.path.append('../')
добавить путь "../" к PYTHONPATH.
Надеюсь, что это работает.

...