python:从相对路径导入

net*_*dur 3 python google-app-engine

我正在尝试从名为template的文件夹导入,其结构类似于

controller/
          /__init__.py
          /login.py # <- I'm here
template/
        /__init__.py # from template import *
        /template.py # contains class Template
Run Code Online (Sandbox Code Playgroud)

python似乎能够看到需要类但无法导入它,这是login.py代码

import webapp2

import template

class Login(webapp2.RequestHandler):
#class Login(template.Template):

    def get(self):
        self.response.out.write(dir(template))
Run Code Online (Sandbox Code Playgroud)

版画

['Template', 'Users', '__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', 'jinja2', 'os', 'template', 'urllib', 'webapp2']
Run Code Online (Sandbox Code Playgroud)

切换进口线

import webapp2

import template

#class Login(webapp2.RequestHandler):
class Login(template.Template):

    def get(self):
    self.response.out.write(dir(template))
Run Code Online (Sandbox Code Playgroud)

版画

class Login(template.Template):
AttributeError: 'module' object has no attribute 'Template'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?谢谢

编辑:我创建了另一个名为index的文件夹,其中包含

index/
     /__init__.py # from index import *
     /index.py # class Index
     /index.html
Run Code Online (Sandbox Code Playgroud)

index.py中的代码是

from template import Template
class Index(Template):
    def get(self):
        self.render("/index/index.html")
Run Code Online (Sandbox Code Playgroud)

这段代码只是没有任何错误,但一个索引控制器文件夹失败

lvc*_*lvc 5

问题是什么时候template/__init__.py:

from template import *
Run Code Online (Sandbox Code Playgroud)

它不是从您认为的位置导入 - 它是从自身导入所有内容,因为有一个名为"template"的文件夹,其中__init__.py定义了一个名为"template"的模块 - 它优先于其内部的模块,也称为"模板".您需要明确告诉Python您需要内部模块,您可以这样做:

from .template import *
Run Code Online (Sandbox Code Playgroud)