python相对导入模块失败

时间:2018-07-20 03:59:18

标签: python import module package

我的文件结构如下:

root/
    v1/
    __init__.py
    example_1.py
    script/
        __init__.py
        classification.py
        prediction.py
        example2.py

分类看起来像这样:

#classification.py    
print(__name__)
from .prediction import predict_func
def func1():
    predict_func()

对于example1.py看起来像这样

#example1.py
from script.classification import func1
func1()

但从example2.py导入分类,如下所示将失败

#example2.py
from classification import func1
func1()    

因为分类中的example2.py场景__name__只是classification而不是script.classification作为example1.py,因此这里没有父节点,因此导入模块失败。

我知道解决方案之一是在example1.py和exaple2.py中都将脚本目录添加到sys.path,并在分类中使用from prediction import predict_func。可以同时在example1.py和example2.py中使用,但这是一个好方法,还有其他替代方法吗?

1 个答案:

答案 0 :(得分:0)

由于example_1.pyroot目录中,因此我认为root是项目的源根。因此,该目录必须出现在Python路径中,即:sys.path

而且,root下的每个目录应该是一个Python包。因此,script必须有一个__init__.py文件(通常为空)。

您应该看一下有关Modules的Python官方教程。

修改

在下面的第二个示例中,您尝试导入分类,就像它是根软件包一样,而不是它。

# example2.py
from classification import func1
func1()

要解决此问题,您需要使用相对导入或完整的软件包名称:

# example2.py
from script.classification import func1
func1()

当然,要运行您的示例,您需要执行以下操作:

python -m script.example2