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时,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 删除。