我是python的新手,但是精通Java。现在,当在python3.5上进行培训时,我面临一个令人讨厌的问题,我具有这样的src结构:
class FlattenWithMasking(Flatten):
def __init__(self, **kwargs):
self.supports_masking = True
super(FlattenWithMasking, self).__init__(**kwargs)
def compute_mask(self, x, mask):
return mask
在main.py中:
/project-root
--main.py
--ModelImpl.py #subclass of BaseModel
--ActionImpl.py #subclass of BaseAction
--/base
----BaseModel.py #base class of all
----BaseAction.py #subclass of BaseModel
----modulescript.py
在modulescript.py中:
from ModelImpl import ModelImpl
from ActionImpl import ActionImpl
modelImpl = ModelImpl()
actionImpl = ActionImpl()
在BaseModel.py中:
from BaseAction import BaseAction
baseAction = BaseAction()
在BaseAction.py中:
class BaseModel:
def __init__(self):
print("BaseModel")
在ModelImpl.py中:
from .BaseModel import BaseModel
class BaseAction(BaseModel):
def __init__(self):
super().__init__()
print("BaseAction")
在ActionImpl.py中:
from base.BaseModel import BaseModel
class ModelImpl(BaseModel):
def __init__(self):
super().__init__()
print("ModelImpl")
现在,当我在终端中输入python3 main.py时,我得到了打印结果:
from base.BaseAction import BaseAction
class ActionImpl(BaseAction):
def __init__(self):
super().__init__()
print("ActionImpl")
但是如果我输入python3模块function.py,我得到了错误:
回溯(最近通话最近一次):
BaseAction导入BaseAction的(模块)中的文件“ modulescript.py”,第1行
.BaseModel导入(模块)中的文件“ /home/jerry/projects/test/python/base/BaseAction.py”,行1,BaseModel SystemError:父模块“”未加载,无法执行相对导入>
我发现这是由于BaseAction.py中的import语句引起的:
BaseModel
ModelImpl
BaseModel
BaseAction
ActionImpl
如果我更改为from .BaseModel import BaseModel
,则modulescript.py可以正常运行,但是main.py将出现错误:
来自ActionImpl导入ActionImpl的(模块)中的文件“ main.py”,第225行
文件“ /home/jerry/projects/test/python/ActionImpl.py”,第1行,位于base.BaseAction(模块)中,导入BaseAction
从BaseModel导入BaseModel的(模块)中的文件“ /home/jerry/projects/test/python/base/BaseAction.py”,第1行
ImportError:没有名为“ BaseModel”的模块
糟糕。烦人!
在Java中,如果您提供类的正确路径,例如from BaseModel import BaseModel
那么,导入python的正确方法是什么?
答案 0 :(得分:0)
这是Python,而不是Java,您将彼此相关的模块归为一个包,即一个文件夹。
要能够从软件包中导入,您必须先做一些事情。
在您的程序包中创建__init__.py
,以使解释器知道它是一个程序包。如果文件夹中没有这样的文件,则无论您是否要从那里导入,它都不会动摇,这不是它的包,仅此而已。
此外,如果您希望(并且在创建要供他人使用的包时应该这样做),请在__init__.py
中导入类函数等,以允许直接从包本身中导入它们。
我举了一个简单的例子:
project tree
:
/root
test.py
/examplepkg
__init__.py
somemodule.py
编辑:如果您希望examplepkg具有“嵌套”程序包,例如,它以某种方式依赖于该程序包,则创建另一个文件夹,然后在其中放置另一个__init__.py
并执行相同的操作,然后在examplepkg的__init__.py
中,您可以进一步将其“导出”以供顶层模块查看。保持一致的方式取决于您自己。
somemodule.py
:
class SomeClass:
def __init__(self):
print("New Instance of SomeClass!")
__init__.py
:
from .somemodule import SomeClass # you could see it as exporting
test.py
:
from examplepkg import SomeClass
SomeClass()
有关更多信息,请read this。
答案 1 :(得分:0)
我遇到了相同的错误,但是当我更改时错误得到了解决
from .BaseModel import BaseModel
到
from base.BaseModel import BaseModel