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包查找路径中。
、
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用Apache ab进行http性能测试
- Android Imageloader的配置的实现代码
- Linux下如何查看版本信息的方法步骤
- Android开发实现Files文件读取解析功能示例
- Android实现iPhone晃动撤销输入功能 Android仿微信摇一摇功能
- 猿实战21——商品发布之商品数据存储
- Android编程自定义进度条颜色的方法详解
- Android TextView对齐的两种方法
- Android ScrollView实现反弹效果的实例
- Ubuntu 18.04上安装 phpMyAdmin的详细教程
- Android Popupwindow弹出窗口的简单使用方法
- 解决CentOS7虚拟机无法上网并设置CentOS7虚拟机使用静态IP上网
- Android编程实现自定义Dialog的大小自动控制方法示例
- Linux中如何查看文件的创建时间详解
- Android 图片添加水印的实现方法