您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

5b51 2022/1/14 8:22:44 python 字数 5233 阅读 570 来源 www.jb51.cc/python

我试图遵循 this previous question中与SQLAlchemy相关的设计模式,并打算在多个文件之间共享一个公共Base实例.完全相同的代码适用于python2和python3. 但是,当我在一个模块(称为模型)中移动文件a.py,b.py,c.py和base.py并添加必要的__init__.py文件时,它继续在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,ForeignKey("A.id"))

模型/ __ init__.py

(空)

main.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只会寻找顶级模块;你没有基础顶级模块,只有model.base.使用完整的模块路径,或使用相对限定符:

from .base import Base

的.在开始时告诉Python 3从当前包开始导入.

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

from __future__ import absolute_import

这是PEP 328引入的更改,从未来的导入可以从Python 2.5开始.

总结

以上是编程之家为你收集整理的导入处理/模块从python2更改为python3?全部内容,希望文章能够帮你解决导入处理/模块从python2更改为python3?所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶