终止模块的非致命输入?

时间:2011-06-02 16:44:17

标签: python import

我想使用if __name__ != '__main__':然后在导入脚本时结束脚本的执行,而不是执行通常的if __name__ == '__main__':和缩进所有其余代码的脚本。文件。

然而,我无法确定只会导致这种情况发生的原因,并且没有其他不良副作用。 sys.exit()停止整个翻译,我尝试过的所有其他事情都会引发某种异常或者是非法的。

更新

我选择了@ trutheality的答案,因为它完成了我想要的并且非常容易开始使用。也就是说,我认为其他几个答案非常有趣和/或聪明 - 感谢所有回复的人 - 并计划在时间允许的情况下进一步调查其中一些。我不知道做我想做的事情会如此参与。

4 个答案:

答案 0 :(得分:2)

与我原来的答案非常相似但略显可怕

partialimport.py

class PartialImport(Exception):
    def __init__(self, locals, msg = ""):
        self.module = locals

main.py

from partialimport import PartialImport
try:
   import foo
except PartialImport, e:
    #Note e.module and therefore foo will be a Dict and not a module instance!
    foo = e.module

foo.py

from partialimport import PartialImport

class Boo:
    pass

if __name__ != "__main__":    
    raise PartialImport(locals())

class Foo:
    pass

声明

这是一个非常可怕的黑客攻击,会增加同伴谋杀你的可能性,但这确实有效。

答案 1 :(得分:2)

另一个哈克:

# code

if __name__ == "__main__": exec("""

# main code

#""")

所以...你已经丢失了缩进,还有语法高亮和你正在使用的编辑器的任何其他功能,除非你每次编辑都注释掉if行。

答案 2 :(得分:1)

main.py

try:
   import foo
except:
    print "Failed to import foo"

foo.py

在文件顶部

if __name__ != "__main__":
   raise RunTimeError("foo must be run as main, not as a module.")

class foo(Object):
   pass

由于python按顺序处理文件,因此不会定义类Foo。

另一个想法是通过PEP 302

重载导入逻辑本身

答案 3 :(得分:1)

最佳解决方案IMO:有两个文件。

<强> module_main.py

import actual_module.py

if __name__ != '__main__':
    raise RunTimeError("You should be importing actual_module.py, not module_main.py")

# Your "main" code

<强> actual_module.py

# Actual module code (classes, functions, etc)

这是“干净的”,因为只有当某些内容确实出错时才会抛出异常 - 没有人应该导入module_main.py,他们应该导入actual_module.py

愚人节解决方案

如果你正在使用python 2.3,entrian有一个goto模块,显然有效!它是作为一个愚人节开玩笑的,并且永远不应该被使用,(如果你看看源代码,你就会明白为什么:它增加了很多开销)但作为概念证明似乎就像我能找到以任何简洁的方式完成你想要的东西的唯一方式。

from goto import goto, label

# Code that should always be imported (classes etc.)

if __name__ != "__main__":
    goto .end

# Stuff to be executed when this is main, NOT indented

label .end