导入处理/模块从python2更改为python3?
我试图遵循中显示的与SQLAlchemy相关的设计模式,并打算跨多个文件共享一个公共基础实例。代码与python2和python3完全相同 但是,当我移动模块(称为model)中的文件a.py、b.py、c.py和base.py并添加必要的_init___;.py文件时,它在python2上继续工作,但在python3上产生错误(详细信息如下) 我有以下文件: model/base.py 型号/a.py 型号/b.py 型号/c.py model/_u init__u;.py (空) main.py python2工程:导入处理/模块从python2更改为python3?,python,python-3.x,sqlalchemy,Python,Python 3.x,Sqlalchemy,我试图遵循中显示的与SQLAlchemy相关的设计模式,并打算跨多个文件共享一个公共基础实例。代码与python2和python3完全相同 但是,当我移动模块(称为model)中的文件a.py、b.py、c.py和base.py并添加必要的_init___;.py文件时,它在python2上继续工作,但在python3上产生错误(详细信息如下) 我有以下文件: model/base.py 型号/a.py 型号/b.py 型号/c.py model/_u init__u;.py (空) main.
$ python main.py ; echo $?
0
python3的错误在于:
$ python3 main.py ; echo $?
Traceback (most recent call last):
File "main.py", line 7, in <module>
from model import a
File "/home/shale/code/py/try/model/a.py", line 2, in <module>
from base import Base
ImportError: No module named base
1
$python3 main.py;回声$?
回溯(最近一次呼叫最后一次):
文件“main.py”,第7行,在
从模型导入a
文件“/home/shale/code/py/try/model/a.py”,第2行,在
从基地导入基地
ImportError:没有名为base的模块
1.
我最终解决了这个问题,将base.py中的代码放入我的_init__.py文件(下面描述为一个答案),但是有人知道为什么这会在python3中产生错误,而在python2中不会产生错误吗?首先是什么变化导致了这一点?我发现的一个解决方案是:
- 将代码从base.py移动到_uinit__uu.py
- 将a.py、b.py和c.py中的
行更改为import base
from。导入基数
- 在model.py中,将
从模型导入库更改为
从模型导入库更改为
- 同样在model.py中,将
更改为base.base
base
from base import base
行就是这样一个导入
Python3将只查找顶级模块;您没有base
顶级模块,只有model.base
。使用完整模块路径,或使用相对限定符:
from .base import Base
开头的
告诉Python 3从当前包开始导入
通过添加以下内容,可以在Python 2中启用相同的行为:
from __future__ import absolute_import
这是由引入的更改,并且从Python 2.5开始就可以使用来自未来的
导入。这在python2和python3中起作用,并清楚地解释了以前python3中出现错误的地方。谢谢(很抱歉,为了一个简单的答案,这个问题太长了。)
from sqlalchemy import create_engine
from sqlalchemy.orm import relationship, backref, sessionmaker
from model import base
from model import a
from model import b
from model import c
engine = create_engine("sqlite:///:memory:")
base.Base.metadata.create_all(engine, checkfirst=True)
Session = sessionmaker(bind=engine)
session = Session()
a1 = a.A()
b1 = b.B()
b2 = b.B()
c1 = c.C()
c2 = c.C()
a1.Bs.append(b1)
a1.Bs.append(b2)
a1.Cs.append(c1)
a1.Cs.append(c2)
session.add(a1)
session.commit()
$ python main.py ; echo $?
0
$ python3 main.py ; echo $?
Traceback (most recent call last):
File "main.py", line 7, in <module>
from model import a
File "/home/shale/code/py/try/model/a.py", line 2, in <module>
from base import Base
ImportError: No module named base
1
from .base import Base
from __future__ import absolute_import