Python的包与模块导入问题

时间:2022-07-24
本文章向大家介绍Python的包与模块导入问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

导入报错

python中导入包与模块时,一般会遇到两个问题:

1、ValueError: attempted relative import beyond top-level package 2、ModuleNotFoundError: No module named 'testpkg'

一个是不能导入顶层超过顶层层次的包,一个是找不到模块

网上的介绍和测试

1、https://www.cnblogs.com/linkenpark/p/10909523.html

2、https://blog.csdn.net/sky453589103/article/details/78863050

3、https://mp.weixin.qq.com/s/qiHmHV9tzVVH-fDvQcOV9g

个人总结

以下为例说明:

testpkg/
    __init__.py
    mypackage/
        __init__.py
        A/
            __init__.py
            spam.py     #* print("In spam") *#
            grok.py     #* print("In grok") *#
            C/
                __init__.py
                hello.py    #* print("In hello") *#
        B/
            __init__.py
            bar.py      #* print("In bar") *#
        run.py
    main.py

1、运行grok.py,如果from ..B import bar,导致错误1

2、运行grok.py,如果from testpkg.mypackage.B import bar,导致报错2

为什么报错?

1、使用相对路径导入导致的顶级层次报错,python中以当前运行的脚本所在目录作为顶层层次,比如运行run.py时,AB都是顶级层次,不能跨越顶级层次引用包或模块!

如果grok.py中打印__name__,会看到包的路径为A.grok,A便为此时的顶级层次,不能跨顶级层次访问B

2、运行脚本时不能识别到顶级层次外的模块,所以导致报错2

如何注意和规划代码层次

1、每个项目应该只有一个能独立运行的py文件,这是项目的主函数入口,该文件应该位于项目的最外层,这样的话运行时顶级层次最高,可以导入项目所有的模块和包了

2、项目内部可能分了很多模块来组织功能,但是内部的模块一般不能独立运行,需要在模块的外面添加一层用来调用以及测试。单独执行内部模块的文件时,可能会因为跨目录导入模块导致运行出错。

3、如果内部模块一定要跨顶级层次导入,则应该使用sys.path.append来将路径添加到python的包查找路径中

4、遇到类似问题,非常轻易的定位,第一步分析当前的顶级层次,是否有跨顶级层次导入,如果有,则应该把脚本放在顶级层次之外运行或添加路径到sys.path包查找路径中。