我对python不熟悉,但对java很在行。现在我在python3.5上训练时遇到了一个恼人的问题,我有这样一个src结构:
/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
在主.py地址:
from ModelImpl import ModelImpl
from ActionImpl import ActionImpl
modelImpl = ModelImpl()
actionImpl = ActionImpl()
在模块脚本.py地址:
from BaseAction import BaseAction
baseAction = BaseAction()
在基本模型.py地址:
class BaseModel:
def __init__(self):
print("BaseModel")
在基本操作.py地址:
from .BaseModel import BaseModel
class BaseAction(BaseModel):
def __init__(self):
super().__init__()
print("BaseAction")
在模型实现.py地址:
from base.BaseModel import BaseModel
class ModelImpl(BaseModel):
def __init__(self):
super().__init__()
print("ModelImpl")
在操作impl.py地址:
from base.BaseAction import BaseAction
class ActionImpl(BaseAction):
def __init__(self):
super().__init__()
print("ActionImpl")
现在当我输入python3主.py在终端,我得到了打印结果:
BaseModel
ModelImpl
BaseModel
BaseAction
ActionImpl
但如果我输入python3模块函数.py,出现错误:
Traceback (most recent call last):
File "modulescript.py", line 1, in (module) from BaseAction import BaseAction
File "/home/jerry/projects/test/python/base/BaseAction.py", line 1, in (module) from .BaseModel import BaseModel SystemError: Parent module '' not loaded, cannot perform relative import
我发现这是因为基本操作.py地址:
from .BaseModel import BaseModel
如果我改为from BaseModel import BaseModel
,则模块脚本.py运行正常,但是主.py将出现错误:
File "main.py", line 225, in (module) from ActionImpl import ActionImpl
File "/home/jerry/projects/test/python/ActionImpl.py", line 1, in (module) from base.BaseAction import BaseAction
File "/home/jerry/projects/test/python/base/BaseAction.py", line 1, in (module) from BaseModel import BaseModel
ImportError: No module named 'BaseModel'
哎呀。烦人的!
在java中,如果提供了类的正确路径(如import com.domain.MyClass;
),则可以从任何位置导入任何类
那么,用python导入的正确方法是什么?你知道吗
这是Python,而不是Java,您将相互相关的模块分组到一个单独的包中,这个包是一个文件夹。你知道吗
为了能够从包中导入,您必须先做几件事。你知道吗
在包中创建
__init__.py
,让解释器知道它是一个包。如果文件夹中没有这样的文件,它甚至不会改变您是否要从那里导入,它不是一个包,仅此而已。此外,如果您想(并且在创建供其他人使用的包时应该这样做)导入
__init__.py
中的类、函数等,以允许直接从包本身导入它们。我举了一个简单的例子:
project tree
:编辑:如果您想让examplepkg有一个“嵌套”的包,比如,它以某种方式依赖的包,您可以创建另一个文件夹,并在其中放置另一个
__init__.py
并执行相同的操作,然后在examplepkg的__init__.py
中您可以进一步“导出”它以供顶级模块查看。如何做到这一点取决于你自己,只要始终如一。你知道吗somemodule.py
:__init__.py
:test.py
:有关详细信息,read this。你知道吗
我得到了同样的错误,但错误得到了纠正,当我改变
至
相关问题 更多 >
编程相关推荐