Python:相对导入是否意味无法单独执行子包?

7 投票
3 回答
2028 浏览
提问于 2025-04-15 15:10

我最近把我的Python项目迁移到了Python 3.1。为了做到这一点,我必须在项目的子模块和子包中使用相对导入的方法。我已经完成了这个步骤,现在整个项目可以正常运行了,但我发现我无法单独执行其中的任何子包或子模块。如果我尝试这样做,就会出现“builtins.ValueError: Attempted relative import in non-package”的错误。我只能导入整个项目。

这是正常现象吗?

3 个回答

-1

我遇到了同样的问题,觉得使用-m这个选项太复杂了。

所以我选择了这个方法:

try:
    from . import bar
except ValueError:
    import bar

if __name__ == "__main__":
    pass
4

是的,这很正常。如果你想运行一个模块,而这个模块又是某个包的一部分(其实这样做有点奇怪),你需要使用绝对导入。当你运行这个模块时,从解释器的角度来看,它并不是包的一部分,而是 __main__ 模块。所以它不知道相对的包在哪里。

标准的做法是把功能放在包里面,然后写一些单独的可执行脚本来调用这些功能。这样你就可以把可执行脚本放在模块外面,比如放在 /usr/bin 目录下。

3

你可以使用python解释器的-m选项来运行子包中的模块(甚至在3.1版本中可以运行包)。

撰写回答