无法使导入在web.py项目中工作
问题内容:
我正在尝试使用Web.Py在Python中创建一个基本的博客应用程序。我开始时没有一个目录结构,但是很快我需要一个。所以我创建了这个结构:
Blog/
├── Application/
│ ├── App.py
│ └── __init__.py
|
├── Engine/
│ ├── Connection/
│ │ ├── __init__.py
│ │ └── MySQLConnection.py
│ ├── Errors.py
│ └── __init__.py
├── __init__.py
├── Models/
│ ├── BlogPostModel.py
│ └── __init__.py
├── start.py
└── Views/
├── Home.py
└── __init__.py
start.py
进口Application.App
,其中包含Web.Py东西进口Blog.Models.BlogPostModel
,其中进口Blog.Engine.Connection.MySQLConnection
。
Application.App
还进口Engine.Errors
和Views.Home
。所有这些导入都发生在构造函数内部,所有文件内的所有代码都在类中。运行时python start.py
,其中包含以下三行代码:
from Application import App
app = App.AppInstance()
app.run()
打印以下堆栈跟踪:
Blog $ python start.py
Traceback (most recent call last):
File "start.py", line 2, in <module>
Blog = App.AppInstance()
File "/home/goktug/code/Blog/Application/App.py", line 4, in __init__
from Blog.Views import Home
ImportError: No module named Blog.Views
但是据我从一些研究中了解到,这应该一直运行,至少要等到App.py之后。 谁能说出我在哪里犯错了?
(我可以根据要求提供更多代码,但是现在我要在这里停止,因为这变得越来越混乱了)。
问题答案:
App.py
包含语句
from Blog.Views import Home
因此Blog
需要位于Python搜索模块(sys.path
)的目录列表中。可以各种方式安排。
- 由于您使用来启动应用程序
python start.py
,因此包含的目录start.py
会自动添加到搜索路径中。所以你可以改变from Blog.Views import Home
至
from Views import Home
-
另一种选择是将目录上移
start.py
一个级别Blog
。然后,当您调用时python start.py
,包含的目录start.py
也将是包含的目录Blog
。所以Python会Blog
在执行时找到from Blog.Views ...
-
最后,您可以将
Blog
目录添加到PYTHONPATH环境变量中。