gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:22:45 25 4
gpt4 key购买 nike

我试图遵循 this previous question 中所示的设计模式与 SQLAlchemy 相关,旨在跨多个文件共享一个公共(public) Base 实例。完全一样的代码适用于 python2 和 python3。

但是,当我在模块(称为模型)中移动文件 a.py、b.py、c.py 和 base.py 并添加必要的 __init__.py 文件时,它会继续在 python2 上运行,但随后在 python3 上产生错误(详情如下)。

我有以下文件:

模型/base.py
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

模型/a.py
from sqlalchemy import *
from base import Base
from sqlalchemy.orm import relationship

class A(Base):
__tablename__ = "A"
id = Column(Integer, primary_key=True)
Bs = relationship("B", backref="A.id")
Cs = relationship("C", backref="A.id")

模型/b.py
from sqlalchemy import *
from base import Base

class B(Base):
__tablename__ = "B"
id = Column(Integer, primary_key=True)
A_id = Column(Integer, ForeignKey("A.id"))

模型/c.py
from sqlalchemy import *
from base import Base

class C(Base):
__tablename__ = "C"
id = Column(Integer, primary_key=True)
A_id = Column(Integer, ForeignKey("A.id"))

模型/__init__.py

(空)

主.py
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()

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

我最终通过将 base.py 中的代码放入我的 __init__.py 文件(如下所述的一个答案)解决了这个问题,但是有谁知道为什么这会在 python3 中产生错误而不是在 python2 中产生错误?首先是什么变化导致了这种情况?

最佳答案

Python 3 默认切换到绝对 导入,并禁止不合格的相对导入。 from base import Base 行就是这样一个导入。

Python 3 只会寻找顶级模块;您没有 base 顶级模块,只有 model.base。使用完整的模块路径,或使用相对限定符:

from .base import Base

开头的 . 告诉 Python 3 从当前包开始导入。

您可以通过添加以下内容在 Python 2 中启用相同的行为:

from __future__ import absolute_import

这是由 PEP 328 引入的更改,并且 from future 导入从 Python 2.5 开始可用。

关于python - 导入处理/模块从 python2 更改为 python3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19644898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com