无法使导入在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.ErrorsViews.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)的目录列表中。可以各种方式安排。

  1. 由于您使用来启动应用程序python start.py,因此包含的目录start.py会自动添加到搜索路径中。所以你可以改变
    from Blog.Views import Home
    

    from Views import Home
  1. 另一种选择是将目录上移start.py一个级别 Blog。然后,当您调用时python start.py,包含的目录start.py也将是包含的目录Blog。所以Python会Blog在执行时找到from Blog.Views ...

  2. 最后,您可以将Blog目录添加到PYTHONPATH环境变量中。