Python相对导入疑问:为何直接import modelling_llama可跨层级生效?
Python模块导入问题解析
项目目录结构
|-- eval.py |-- modeling_llama.py |-- patch | |-- __init__.py | |-- flash_attn.py | |-- log_scale.py | |-- ntk.py | |-- ntk_fixed.py | |-- ntk_mixed.py | `-- rerope.py |-- prompt.py |-- test_model.sh `-- utils.py
三种导入方式的具体分析
1. import modelling_llama 能正常工作的原因
你直接运行的是eval.py,Python会自动把当前运行脚本所在的项目根目录加入到sys.path的最前面。当eval.py导入utils.py,utils.py再导入patch包时,rerope.py执行导入操作时,sys.path里已经包含了项目根目录,Python会直接在这些路径里查找modelling_llama.py,自然能找到目标模块。
2. from .. import modelling_llama 失败的原因
相对导入依赖模块的__package__属性,只有当模块被当作包的一部分导入时才有效。这里patch被utils.py导入,而utils.py是被作为脚本运行的eval.py导入的,此时rerope.py的__package__值为patch,但..指向的上层目录(项目根目录)并没有被Python视为合法的包(根目录没有__init__.py,就算有,直接运行脚本的场景下,Python也不会把根目录当作顶层包处理)。另外Python禁止从顶层包之外进行相对导入,所以这种写法会报错。
3. import ..modeling_llama 直接语法错误
这种写法本身就不符合Python的语法规范,相对导入只能用from .. import 模块名的形式,import ..xxx的写法从语法上就不被支持,所以直接运行就会报错。
内容的提问来源于stack exchange,提问作者Arist12
相关产品推荐
相关产品推荐

