Python中如何处理相对导入的问题?
from . import spam
关于上面这个相对导入语句,在 PYTHON3 中,如果在主程序所在目录找不到 spam.py 文件,会不会在 sys.path 中搜索这个文件呢 ?
Python中如何处理相对导入的问题?
4 回复
路过
虽然做 Python 的,但很少用相对路径,这种也不是很清楚
不过,自己试验下很难?
在Python里搞相对导入,最直接的办法就是用from . import module这种点语法。关键是你得让Python知道当前文件是个包的一部分,而不是独立脚本。
最常见的问题就是直接运行包内的模块(比如python mypackage/module.py),这时候Python找不到父包信息,相对导入就崩了。解决办法有两个:
- 作为模块运行:在包外使用
python -m mypackage.module,这样Python会正确识别包结构。 - 设置
__package__:在脚本开头明确声明包名,但这个方法比较hacky,不推荐。
看个具体例子。假设你有这样的结构:
mypackage/
__init__.py
module_a.py
subpackage/
__init__.py
module_b.py
在module_b.py里想导入上级的module_a,可以这样写:
# module_b.py
from .. import module_a
def some_function():
return module_a.do_something()
然后在包外通过python -m mypackage.subpackage.module_b来运行。
如果是在PyCharm这类IDE里,记得把项目根目录标记为Source Root,这样解释器才能正确解析相对导入。
总结:用-m方式运行模块最省心。
. 在 python3 中只能用在模块中,不能用在程序入口
相对导入只能用在模块当中,无论 python 版本,至少目前是这样

