2009-10-18 44 views
7

我最近将我的Python项目移植到了Python 3.1上运行。为此,我不得不在我的项目的子模块和子包中采用相对导入策略。我不这样做,现在项目本身工作,但我注意到我不能执行其中的任何子包或子模块。如果我尝试,我会得到“builtins.ValueError:尝试在非包装中的相对导入”。我只能导入整个项目。Python:相对进口意味着你不能自己执行一个子包吗?

这是正常的吗?

回答

3

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

+0

我会说你*有*使用'-m'开关;这不是你*可以*。我喜欢直接调用python文件,因为我不需要记住开关,而且我的shell很好地自动完成。 – 2016-06-24 14:37:48

+0

如果您对从子模块运行可执行的python脚本感兴趣,请参阅此答案:http://stackoverflow.com/a/11537218/730150 – krumpelstiltskin 2016-11-29 13:59:05

4

是的,这是正常的。如果你想执行一个也是包的一部分的模块(本身就是一件很奇怪的事),你需要有绝对的导入。从执行模块的角度来看,它不是从解释器的角度来看,而是模块的一部分,但不是模块。所以它不知道相关软件包在哪里。

标准的方式来做到这一点是必须在包装,并调用该函数独立可执行脚本的功能,因为这使您可以把可执行的脚本模块外,例如在/ usr/bin中

+1

哇,我觉得这个理念怪异。例如,我在我的项目中有一个“生命”包。它的绝对路径是'garlicsim.bundled.simulation_packages.life'。我本来希望能够自己运行它,因为它不依赖于'蒜薹'中的任何东西。为什么我不能自己运行它? – 2009-10-18 19:55:53

+0

1.如果它不依赖大蒜中的任何东西,那么为什么它在大蒜中? 2.为什么你不能自己运行它?你可以自己运行它,但你需要有绝对的导入,也就是'from garlicsim.bundled.simulation_packages.life import'。 3.你觉得奇怪的哲学是什么?我没有提到任何哲学,所以我不知道这个哲学是什么。 – 2009-10-18 20:16:24

+3

1.它只是捆绑在一起。但我可以再举一个'garlicsim.asynchronous_crunching.crunchers'的例子,这是蒜素依赖的一个子包装,但它不依赖大蒜素。 (2)说如果有一天我想将它移动到另一个包,为什么我不能在没有编辑导入行的大惊小怪的情况下? (3)也许我应该说“政策”而不是“哲学”。这种态度,能够(a)独立执行包,或(b)容易地将其移植到其他包,但不是两者兼而有之。 – 2009-10-18 20:40:26

-1

我有same problem,我认为-m切换太难了。

相反,我用这个:

try: 
    from . import bar 
except ValueError: 
    import bar 

if __name__ == "__main__": 
    pass 
+0

隐式相对导入在python 2.7中被弃用和删除。 – habnabit 2010-09-13 16:05:02

+0

阿龙,你是对的,但我不明白这是如何改变我的解决方案。这适用于任何python 2.5-3.1。 – sorin 2010-09-13 18:27:40

+0

不,这在3.x中不起作用。它在2.7+中被删除,其中包括3.0-3.1。 – habnabit 2010-09-14 08:19:57