if __name__ ==' __ main __'在IPython中

时间:2014-04-07 21:00:02

标签: python ipython

我有使用if __name__ == '__main__'技巧的Python脚本,只有在脚本作为脚本调用时才会运行某些代码,而不是在将脚本加载到交互式解释器时运行。但是,当我使用%edit命令从IPython编辑这些脚本时,IPython显然将__name__设置为'__main__',因此每次退出编辑会话时代码都会运行。从IPython编辑模块时,是否有一种很好的方法可以使代码不运行?

4 个答案:

答案 0 :(得分:16)

在Emacs中工作时(我假设它与%edit的内容很接近),我通常会使用这个技巧:

if __name__ == '__main__' and '__file__' in globals():
    # do what you need

出于显而易见的原因,__file__仅针对import个模块定义,而不是针对交互式shell定义。

答案 1 :(得分:10)

听起来您可能只需要-x开关:

In [1]: %edit
IPython will make a temporary file named: /tmp/ipython_edit_J8j9Wl.py
Editing... done. Executing edited code...
Name is main -- executing
Out[1]: "if __name__ == '__main__':\n    print 'Name is main -- executing'\n"

In [2]: %edit -x /tmp/ipython_edit_J8j9Wl
Editing...

当您致电%edit -x时,退出编辑后代码未执行。

答案 2 :(得分:5)

IPython将函数get_ipython()添加到全局可用变量中。因此,您可以测试globals()中是否存在此功能以做出决定:

if __name__ == '__main__' and "get_ipython" not in dir():
    print "I'm not loaded with IPython"

上面的代码只是测试是否存在名为get_ipython的全局变量。要测试此变量是否可调用,您可以执行以下操作:

if __name__ == '__main__' and not callable(globals().get("get_ipython", None)):
    print "I'm not loaded with IPython"

答案 3 :(得分:1)

IPython会自动执行您使用%edit命令编写的代码。您可以使用%edit -x指定您不想运行刚刚编辑的代码。

http://ipython.org/ipython-doc/stable/api/generated/IPython.core.magics.code.html