为什么相对导入不能在Python 3中运行?

时间:2014-05-15 19:27:51

标签: python

我最近从python2.7升级到python3,并认为它可能搞砸了一些配置。现在,当我尝试运行模块时,出现导入错误。我们假设我有一个像这样的目录结构:

/directory
/directory/__init__.py
/directory/run.py
/directory/app/db.py
/directory/app/views.py
/directory/app/__init__.py

使用以下导入...

/directory/run.py says 'import app'
/directory/app/db.py says 'import views'

当我执行run.py时,我收到一条错误消息,指出无法找到模块视图。但是,如果我进入/ directory / app并执行db.py,则导入正确运行。我还发现,如果我将/directory/app/db.py更改为来自应用导入视图""然后它在执行run.py时正常工作。但是,这用于所有工作!

似乎导入语句没有考虑它正在执行的文件夹。看起来这要我将所有导入基于根文件夹,这看起来不正确并且会带我是时候改变一切了。

关于发生了什么的任何想法?这让我很疯狂。

2 个答案:

答案 0 :(得分:4)

在Python3中,已删除隐式相对导入,所有导入都必须是绝对导入,或使用显式相对导入。

这不会改变,您需要将其替换为from app import viewsfrom . import views

答案 1 :(得分:1)

Python 2.x和Python 3.x在很多方面有所不同,通常使用2to3或其他类似工具非常有帮助#34; port" (转换)代码。

您遇到的问题可能与Python 2使用相对导入但Python 3使用绝对导入这一事实有关(我可能会倒退)。可以更改import语句以使导入工作,但是对于肯定会出现的兼容性问题,我强烈建议使用2to3然后手动进行任何最终调整。

祝你好运!