Python / Flask - неожиданно появляется ошибка «ImportError: модуль не указан ...» - PullRequest
0 голосов
/ 01 января 2019

Я сталкиваюсь с тем, что, по моему мнению, является довольно распространенной проблемой в приложениях Python - ImportError: No module named lib.handle_data - но я недостаточно опытен с экосистемой Python / Flask, чтобы действительно понять, почему это происходит, особенно с учетом того, что мой код работал , пока я не внес небольшую корректировку и не переустановил некоторые зависимости.Хорошо, вот как все прошло ...

Я работаю над приложением Flask, и до недавнего времени оно работало нормально.Я понял, что не включил семантическое управление версиями для зависимостей в мой файл setup.py.Первоначально файл выглядел так:

from setuptools import setup

setup(
    name='my_app',
    packages=['my_app'],
    include_package_data=True,
    python_requires='>3.6.4',
    install_requires=[
        'flask',
        'gtfs-realtime-bindings',
        'gunicorn',
    ],
)

, который я изменил, чтобы он выглядел так:

from setuptools import setup

setup(
    name='my_app',
    packages=['my_app'],
    include_package_data=True,
    python_requires='>3.6.4',
    install_requires=[
        'flask==0.12.2',
        'gtfs-realtime-bindings==0.0.5',
        'gunicorn==19.7.1',
    ],
)

, а затем, чтобы убедиться, что все было хорошо, я запустил python setup.py install и всеказалось, все прошло нормально - ни одна из версий не изменилась, так как это были те, которые уже были установлены.

Однако, когда я запустил flask run, сервер не запустился, и у меня осталась ошибка:

import my_app.lib.handle_data as HandleData
ImportError: No module named lib.handle_data

и попытка запустить сервер с gunicorn через

gunicorn my_app.my_app:app -b 0.0.0.0:8000

приводит к той же ошибке (не удивительно, я уверен, просто исчерпывающе).

Вот структура файла:

setup.py
my_app/
   |
   - __pycache__/
   - __init__.py
   - my_app.py
   - lib/
      |
      - __pycache__/
      - __init__.py
      - handle_data.py
      - request.py

Содержимое my_app/__init__.py:

from .my_app import app

и my_app/lib/__init__.py пусто.

Как я сломал свое приложение, и как я могу это исправить?

Python версия 3.6.4, работает на MacOS Mojave, 10.14.И если я не прояснил это, мое приложение работало нормально, прежде чем я сделал это изменение / переустановил deps.

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Вы должны добавить "my_app.lib" к packages, потому что в противном случае соответствующий подпакет и модули my_app.lib.* не будут установлены.Вы можете проверить существующую установку с помощью

>>> import my_app
>>> my_app.__file__
'/path/to/virtualenv/lib/python3.6/site-packages/my_app/__init__.py'

. Теперь проверка соответствующего каталога покажет, что lib отсутствует.Если вы добавите "my_app.lib" к packages, тогда будет также установлен каталог (пакет) lib.

Относительно того, почему он работал раньше, пока вы ничего не изменили в настройке / структуре пакета.Я могу только строить догадки.Однако в процессе установки есть одна вещь, которая может оказать влияние.Если вы установили пакет в режиме --editable (-e) (или python setup.py develop) 1 до этого, ваша среда будет содержать my-app.egg-link, указывающую на исходный каталог пакета вместо копиисоответствующие файлы.Таким образом, my_app.lib, конечно, не пропадает (так как он содержится в исходном каталоге).Согласно вашему описанию, вы применили «нормальную» установку после применения изменений, и для этого требуется полная структура, как указано в packages, чтобы завершить (также использование --upgrade приведет к удалению ссылки).


1.--editable / -e - это опция pip для размещения ссылки на исходный каталог, а не для копирования соответствующих файлов;используя setup.py напрямую, соответствующий режим равен develop, то есть python setup.py develop.

0 голосов
/ 01 января 2019

на этот вопрос уже отвечали все, кто наткнулся на это на a_guest.Просто пытаясь сэкономить время других людей между прочим a_guest, если вы хотите, чтобы моя репутация была опубликована здесь, я удалю ее, и вы можете опубликовать ее, я просто не хотел, чтобы кто-то проводил время на отвеченном вопросе Q

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...