Docker环境下同目录Python模块导入失败的原因与解决方法
问题原因与解决方法
为什么会出现这个错误?
Python的模块导入是基于sys.path列表查找模块的。当你通过python3 rest_api.py启动程序时,rest_api.py所在的目录(容器内的/usr/application)会被自动加入sys.path,所以from app.main import ...能正常找到app包。
但main.py是作为app包的子模块被导入的,运行上下文属于app包。此时用from foo import *属于绝对导入,Python会直接去sys.path里找名为foo的模块,不会自动在app目录下查找,自然找不到同级的foo.py。
解决方法
三种可靠方案任选其一即可:
使用相对导入(推荐)
在main.py里改成包内相对导入的写法,用.表示当前包的同级目录:from .foo import * # 导入bar.py同理: # from .bar import *这种写法明确指向当前包内的同级模块,符合Python包设计规范。
添加
__init__.py(规范包结构)
在app目录下创建一个空的__init__.py文件,虽然Python 3.3+支持无此文件的命名空间包,但这个文件能明确标识app是Python包,避免潜在导入歧义。使用绝对导入
直接用完整包路径导入模块,这种方式在任何上下文下都能稳定找到模块,适合大型项目:from app.foo import * # 导入bar.py则写: # from app.bar import *
内容的提问来源于stack exchange,提问作者Norhther
相关产品推荐
相关产品推荐

