Python 打包导致 ImportError
我在尝试在一个 __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 个回答
0
这通常是因为Python找到了一个和你想用的名字相同,但实际上不同的包或模块。还有一种情况是你在包的空间内运行它时也可能出现这个问题。首先,试着把默认目录改成你的主目录,然后再试一次。如果还是不行,可以在你的模块顶部加上:
from __future__ import absolute_import
这样可以防止使用相对导入的旧默认行为,这种导入方式是在包的空间内进行的。
另外,在调试的时候,可以打印出__file__
这个属性,看看它是不是你预期的那个。
0
"app/app" 这样写会引发问题,因为这两个目录都在搜索路径里。
4
很可能在 app/__init__.py
这个文件里有问题,导致出现错误,可能是语法错误。这种错误往往会在后面变成导入错误,看起来不太明显。
在你想要导入的模块开头加上一个
import pdb;pdb.set_trace()
这样你就可以逐步检查这个模块,看看真正的错误是什么了。