Python: 从相对路径导入模块

3

我可以帮您进行翻译。以下是需要翻译的内容:

我正在尝试从名为“template”的文件夹导入文件,它的结构如下:

controller/
          /__init__.py
          /login.py # <- I'm here
template/
        /__init__.py # from template import *
        /template.py # contains class Template

Python似乎能够识别需要的类,但是无法导入它,这是login.py代码。

import webapp2

import template

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

    def get(self):
        self.response.out.write(dir(template))

打印
['Template', 'Users', '__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', 'jinja2', 'os', 'template', 'urllib', 'webapp2']

切换导入行

import webapp2

import template

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

    def get(self):
    self.response.out.write(dir(template))

打印
class Login(template.Template):
AttributeError: 'module' object has no attribute 'Template'

我做错了什么?谢谢。

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

index/
     /__init__.py # from index import *
     /index.py # class Index
     /index.html

index.py中的代码是:

from template import Template
class Index(Template):
    def get(self):
        self.render("/index/index.html")

这段代码没有出现任何错误,但其中一个索引控制器文件失败了。


难道template不是一个包(目录),其中包含模块template(文件),该模块又包含模板类Template吗?如果是这样,您需要使用template.template.Template。 - Guy Adini
1
创建一个与包中模块同名的包并不是一个好主意。 - BrenBarn
伙计,我又做了一个测试用例,而且它也通过了。包名是不是很重要? - netdur
1个回答

5
问题在于当template/__init__.py执行以下操作时:
from template import *

它并不是从你认为的地方导入 - 它从自己导入了所有东西,因为拥有一个名为'template'的文件夹和一个 __init__.py定义了一个名为'template'的模块 - 该模块优先于其中也叫'template'的模块。你需要明确告诉Python你想要内部模块,可以像这样做:

from .template import *

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接