упаковка Python вызывает импортер - PullRequest
2 голосов
/ 31 декабря 2010

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

#/home/me/app/app/__init__.py
from flaskext.sqlalchemy import SQLAlchemy

db = SQLAlchemy(app)

#/home/me/app/app/models/__init__.py
from datetime import datetime
from app import db

#shell
[me@archlinux app]$ pwd
/home/me/app
[me@archlinux app]$ ./manage.py 
/home/me/app/app/__init__.pyc
Traceback (most recent call last):
  File "./manage.py", line 7, in <module>
    from app import app
  File "/home/me/app/app/__init__.py", line 3, in <module>
    from app.views.post import post
  File "/home/me/app/app/views/post.py", line 4, in <module>
    from app.models import Post
  File "/home/me/app/app/models/__init__.py", line 5, in <module>
    from app import db
ImportError: cannot import name db

[me@archlinux app]$ tree 
.
├── apikey.txt
├── manage.py
├── app
│   ├── forms
│   │   ├── __init__.py
│   │   └── __init__.py~
│   ├── __init__.py
│   ├── __init__.py~
│   ├── __init__.pyc
│   ├── models
│   │   ├── __init__.py
│   │   ├── __init__.py~
│   │   └── __init__.pyc
│   ├── static
│   │   ├── css
│   │   │   └── style.css
│   │   ├── images
│   │   │   ├── favicon.png
│   │   │   ├── logo.png
│   │   │   ├── text_logo.png
│   │   │   ├── thumb_down_active.png
│   │   │   ├── thumb_down_inactive.png
│   │   │   ├── thumb_up_active.png
│   │   │   └── thumb_up_inactive.png
│   │   ├── js
│   │   │   └── index.js
│   │   └── sitemap.xml
│   ├── templates
│   │   ├── 404.html
│   │   ├── 500.html
│   │   ├── about.html
│   │   ├── base.html
│   │   ├── feedback
│   │   │   └── feedback_form.html
│   │   ├── form.html
│   │   ├── posts
│   │   │   ├── comment.html
│   │   │   ├── post.html
│   │   │   └── posts.html
│   │   ├── spam.html
│   │   ├── terms.html
│   │   └── users
│   │       ├── login_form.html
│   │       └── sign_up_form.html
│   ├── util
│   │   ├── forms.py
│   │   ├── honeypot.py
│   │   ├── __init__.py
│   │   ├── __init__.py~
│   │   ├── json_http.py
│   │   ├── models.py
│   │   └── spam.py
│   └── views
│       ├── feedback.py
│       ├── __init__.py
│       ├── __init__.pyc
│       ├── post.py
│       ├── post.pyc
│       └── user.py
├── settings.py
├── settings.pyc
└── TiddlyWiki.html

13 directories, 49 files

В чем может быть проблема?

Некоторые играют с pdb_trace (), помещенным прямо перед импортом:

(Pdb) import app
(Pdb) app
<module 'app' from '/home/ramin/app/app/__init__.pyc'>
(Pdb) dir(app)
['Flask', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'views']

нет базы данных в приложении:)

Ответы [ 5 ]

4 голосов
/ 31 декабря 2010

Вероятно, в app/__init__.py есть проблема, которая вызывает ошибку, как-то, возможно, синтаксическую ошибку. Эти ошибки имеют тенденцию быть скрытыми как ошибки импорта позже.

положить

import pdb;pdb.set_trace()

В начале модуля, который он пытается импортировать. Затем вы можете пройти через этот модуль, чтобы увидеть реальную ошибку.

0 голосов
/ 06 февраля 2014

Я видел "ImportError: модуль не указан", потому что мои модули не имели разрешений на выполнение.

0 голосов
/ 06 декабря 2011

Из трассировки стека, кажется, происходит следующее:

  • внутри приложения вы импортируете views.post
  • это импортирует пост из моделей
  • импорт модели из приложения
  • , который будет импортировать приложение, которое будет импортировать представления ...

так, похоже на циклический импорт?

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

"app / app" вызывает проблемы, оба каталога находятся в пути поиска.

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

Это чаще всего вызвано тем, что Python находит пакет или модуль с тем же именем, которое отличается от того, которое вы думаете.Я также могу случиться, когда вы попытаетесь запустить его из-за недостатка места в пакете.Сначала попытайтесь изменить каталог по умолчанию на домашний, и попробуйте снова.Если это по-прежнему не удается, попробуйте добавить в начало своих модулей:

from __future__ import absolute_import

Это предотвращает использование по умолчанию старого режима использования относительного импорта из пространства пакета.

Также в сеансе отладчикараспечатайте атрибут __file__ и убедитесь, что он соответствует вашим ожиданиям.

...