Ошибка 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)

Посмотрите эту проблему для получения дополнительной информации о том, почему перегрузчик имеет проблемы с некоторыми шаблонами.

Другие вопросы по тегам