Ошибка Flask на Python 3.4? Сервер разработки не может работать, если приложение содержит относительный импорт
По своей сути Python 3 не может запускать модуль, который содержит относительный импорт в виде скрипта. Попытка сделать это приводит к следующей ошибке:
$ python mypackage/run.py
[...traceback...]
SystemError: Parent module '' not loaded, cannot perform relative import
Решение состоит в том, чтобы вызвать модуль с python -m mypackage.run
вместо более привычного python mypackage/run.py
,
В Flask последний - это то, как обычно запускается сервер разработки. Однако сервер разработки Flask немедленно запускает дочерний процесс, который перезагружает код (и впоследствии перезагружает код при изменении файлов на диске).
Результат таков:
$ python -m mypackage.run
* Running on http://127.0.0.1:5000/
* Restarting with reloader
[...traceback...]
SystemError: Parent module '' not loaded, cannot perform relative import
Таким образом, теперь сервер запускается правильно, но дочерний процесс неправильно загружает код.
1 ответ
Вероятно, это связано с тем, как работает перегрузчик. Он имеет тенденцию связываться с путем Python, если вы делаете что-то непредвиденным образом, например, вызываете внутренний модуль напрямую для запуска приложения.
Переехать run.py
из вашего проекта полностью. В любом случае, это полезно только при разработке, поскольку при производственном развертывании приложение будет использоваться непосредственно, а не на сервере разработки.
/my_project/
/run.py
/my_package/
/__init__.py
/my_module.py
казнить run.py
от my_project
каталог (или иным образом положить my_project
на пути Python). Это будет очень просто, что-то вроде:
from my_project_pkg import app
app.run(debug=True)
Посмотрите эту проблему для получения дополнительной информации о том, почему перегрузчик имеет проблемы с некоторыми шаблонами.