Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
导入处理/模块从python2更改为python3?_Python_Python 3.x_Sqlalchemy - Fatal编程技术网

导入处理/模块从python2更改为python3?

导入处理/模块从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.

我试图遵循中显示的与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工程:

$ 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
我仍然不确定为什么以前的设计在python2中工作,而不是在python3中工作。上述更改使其在python2和python3中都能工作。

python3默认情况下切换为绝对导入,并且不允许非限定的相对导入。
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