Python: невозможно импортировать модуль - PullRequest
0 голосов
/ 17 мая 2019

Я учу колбу от https://blog.miguelgrinberg.com/

У меня есть микроблог приложения с именем файла microblog.py

from app import app

и у меня есть каталог с именем app, и он содержит __init__.py с кодом ниже

from flask import Flask
from config import Config

app = Flask( __name__ )
app.config.from_object(Config)
from app import routes

Но когда я запускаю flask run, я получаю ошибку как

ImportError: No module named 'app'

Я понимаю, что если я хочу указать каталог как пакет, я должен включить в каталог __init__.py, и я сделал это для каталога app.

Структура каталогов

.
├── __init__.py
├── app
│   ├── __init__.py
│   ├── forms.py
│   ├── routes.py
│   └── templates
│       ├── base.html
│       ├── index.html
│       └── login.html
├── config.py
└── microblog.py

Полная трассировка стека


flask run                                       
 * Serving Flask app "microblog.py"
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
Usage: flask run [OPTIONS]

Error: While importing "microblog.microblog", an ImportError was raised:

Traceback (most recent call last):
  File "~/anaconda3/envs/flask_python3.5.2/lib/python3.5/site-packages/flask/cli.py", line 235, in locate_app
    __import__(module_name)
  File "~/learning/migual_flask/microblog/microblog.py", line 1, in <module>
    from app import app
ImportError: No module named 'app'

И этот код работал до недавнего времени и внезапно начал доставлять неприятности. Я не могу найти, где это идет не так.

Любая помощь с благодарностью.

Спасибо.

1 Ответ

3 голосов
/ 17 мая 2019

Хорошо, из того, что вы публикуете в иерархии, ясно, что оно должно работать, но я подозреваю, что вы импортировали из неправильного каталога.

Учитывая каталог:

.
├── __init__.py
├── app
│   ├── __init__.py
│   ├── forms.py
│   ├── routes.py
│   └── templates
│       ├── base.html
│       ├── index.html
│       └── login.html
├── config.py
└── microblog.py

Предположим, вы импортируете их из корневого каталога ("." Вверху):

$ls                                                                                                                                                        
__init__.py  app          config.py    microblog.py

$ls app
__init__.py  forms.py     routes.py

# which works
>>> import config
>>> import microblog
>>> import app

# and
>>> from app import routes
>>> from app import forms

Я заметил, что у вас есть app = Flask() в вашем app/__init__.py, что является очень плохой практикой, которой следует как можно больше избегать (что заставляет вас думать, что это хорошо? Я не могу думать ни о чем), но это у меня работает:

>>> import app
>>> from app import app

# the first app is module
# the second is app = Flask()
# but the second one will overwrite the first one's name
# which is another terrible practice

И вы можете проверить модуль:

>>> import app
>>> help(app) # app = Flask() is there
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...