在终端与Jupyter中从不同目录导入Python文件的问题
Python包导入问题的解决方案
问题根源
直接执行python package/app1/foo.py时,Python会将package/app1视为顶层模块所在目录,而非把project下的package当作完整包结构的一部分。这就导致:
- 相对导入
from ..app2 import bar找不到父包,因为Python无法识别package作为当前模块的上层包 - 绝对导入
from package.app2 import bar失效,因为此时sys.path里没有project目录,Python找不到package这个顶层包
正确解决方法
方法1:使用模块方式运行脚本(推荐)
在project目录下,用-m参数以模块形式运行foo.py:
python -m package.app1.foo
这种方式会让Python把project目录加入sys.path,同时将package识别为顶层包,此时foo.py里的相对导入from ..app2 import bar或者绝对导入from package.app2 import bar都能正常工作。
方法2:临时修改sys.path(不推荐,仅作应急)
如果必须直接运行foo.py,可以在foo.py的最开头添加代码,手动将project目录加入sys.path:
import sys from pathlib import Path # 获取project目录的绝对路径并加入sys.path project_dir = str(Path(__file__).parent.parent.parent) if project_dir not in sys.path: sys.path.insert(0, project_dir) # 之后就能正常使用绝对导入 from package.app2 import bar
但这种方法会破坏包的独立性,不建议在正式项目中使用。
内容的提问来源于stack exchange,提问作者Nelson Salazar
相关产品推荐
相关产品推荐

