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