我有Python脚本使用这个if __name__ == '__main__'技巧,只有在脚本作为脚本调用时才运行某些代码,而不是在将脚本加载到交互式解释器时运行.但是,当我使用该%edit命令从IPython编辑这些脚本时,IPython显然设置__name__为'__main__',因此每次退出编辑会话时代码都会运行.从IPython编辑模块时,是否有一种很好的方法可以使代码不运行?
ffr*_*end 19
当在Emacs中工作时(我假设它接近你得到的%edit),我通常使用这个技巧:
if __name__ == '__main__' and '__file__' in globals():
# do what you need
Run Code Online (Sandbox Code Playgroud)
出于显而易见的原因,__file__仅针对import'ed模块定义,而不针对交互式shell定义.
Two*_*ist 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...
Run Code Online (Sandbox Code Playgroud)
当您%edit -x退出编辑器时,调用代码时不会执行.
IPython将该函数添加get_ipython()到全局可用变量中.因此,您可以测试,是否存在此功能globals()以做出决定:
if __name__ == '__main__' and "get_ipython" not in dir():
print "I'm not loaded with IPython"
Run Code Online (Sandbox Code Playgroud)
上面的代码只是测试是否存在具有名称的全局变量get_ipython.要测试此变量是否可调用,您可以执行以下操作:
if __name__ == '__main__' and not callable(globals().get("get_ipython", None)):
print "I'm not loaded with IPython"
Run Code Online (Sandbox Code Playgroud)