我创建了一个名为"pkg"的软件包,它看起来像这样:
pkg/
__init__.py
mod1.py
mod2.py
__init__.py
为空。
mod1.py
只包含一个函数,看起来是这样的。
# mod1.py
def my_sqrt(x):
s = 5 # initialize at 5
while abs(x - s**2) > 0.00001:
s = (s+x/s)/2
return s
mod2.py
包含使用来自mod1.py
的函数my_sqrt
的函数,并且看起来如下。
# mod2.py
def fourth_root(x):
return my_sqrt(my_sqrt(x))
现在当我运行时
from pkg import *
my_sqrt(9)
我得到了3.000000001396984
的输出,但如果我运行
fourth_root(81)
我得到一个错误ModuleNotFoundError: No module named 'mod1'
。即使我在mod2.py
中添加以下行,
from mod1 import my_sqrt
它仍然不起作用,并抛出以下错误:NameError: name 'my_sqrt' is not defined
。
由于某些逻辑结构,我想在单独的模块中定义函数my_sqrt
和fourth_root
。我如何做到这一点而不出错。我很难理解如何安排我的包,以便处理模块之间的相互依存关系。
在pkg级别从mod1.py和mod2.py导入所有方法。
init.py应该如下所示来实现您想要的。
from mod1 import my_sqrt
from mod2 import fourth_root
从init.py 中的mod1.py和mod2.py导入方法
init.py应该是这样的。
from .mod1 import my_sqrt
from .mod2 import fourth_root
__all__ = [my_sqrt, fourth_root]
代码应该在pkg目录中运行。但既然你想从外部运行它,你就必须提到它的本地路径。否则,当主代码(pkg外部)进入pkg/mod2.py时,它开始在其位置级别查找mod1模块,但找不到它。
"从.mod1导入my_sqrt";mod2内部应该可以工作。添加点是这里的关键。