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

Python: Do relative imports mean you can't execute a subpackage by itself?

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

这是正常的吗?


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

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


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


我有同样的问题,我认为-m开关太难了。

相反,我用这个:

1
2
3
4
5
6
7
try:
    from . import bar
except ValueError:
    import bar

if __name__ =="__main__":
    pass