前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python的包与模块导入问题

Python的包与模块导入问题

原创
作者头像
零分影魔
修改2020-08-27 14:33:59
2.4K0
修改2020-08-27 14:33:59
举报
文章被收录于专栏:无所不能,无所能

导入报错

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

个人总结

以下为例说明:

代码语言:javascript
复制
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时,A\B都是顶级层次,不能跨越顶级层次引用包或模块!

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

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

如何注意和规划代码层次

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

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

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导入报错
  • 网上的介绍和测试
  • 个人总结
    • 为什么报错?
      • 如何注意和规划代码层次
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档