Python:相对导入意味着你不能自己执行子包吗?

时间:2009-10-18 19:12:08

标签: python import python-3.x

我最近移植了我的Python项目以在Python 3.1上运行。为此我必须在我的项目的子模块和子包中采用相对导入的策略。我不这样做,现在项目本身有效,但我注意到我无法执行其中的任何子包或子模块。如果我尝试,我得到“builtins.ValueError:在非包中尝试相对导入”。我只能导入整个项目。

这是正常的吗?

3 个答案:

答案 0 :(得分:4)

是的,这很正常。如果你想执行一个也是包的一部分的模块(本身就是一件奇怪的事情),你需要进行绝对导入。当您执行模块时,从解释器的角度来看,它不是包的一部分,而是__main__模块。所以它不知道相关包的位置。

执行此操作的标准方法是在包中包含函数,以及调用函数的单独可执行脚本,因为这使您可以将可执行脚本放在模块外部,例如在/ usr / bin

答案 1 :(得分:3)

你可以使用python解释器的-m标志来运行子包中的模块(甚至是3.1中的包。)。

答案 2 :(得分:-1)

我有same problem,我认为-m开关太难了。

相反,我使用它:

try:
    from . import bar
except ValueError:
    import bar

if __name__ == "__main__":
    pass