Python中如何处理相对导入的问题?

from . import spam

关于上面这个相对导入语句,在 PYTHON3 中,如果在主程序所在目录找不到 spam.py 文件,会不会在 sys.path 中搜索这个文件呢 ?
Python中如何处理相对导入的问题?

4 回复

路过
虽然做 Python 的,但很少用相对路径,这种也不是很清楚
不过,自己试验下很难?


在Python里搞相对导入,最直接的办法就是用from . import module这种点语法。关键是你得让Python知道当前文件是个包的一部分,而不是独立脚本。

最常见的问题就是直接运行包内的模块(比如python mypackage/module.py),这时候Python找不到父包信息,相对导入就崩了。解决办法有两个:

  1. 作为模块运行:在包外使用python -m mypackage.module,这样Python会正确识别包结构。
  2. 设置__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 版本,至少目前是这样

回到顶部