我有一些Python脚本,它们使用if __name__ == '__main__'
技巧让一些代码仅在脚本被调用时运行,而不是在加载到交互式解释器中时运行。但是,当我使用%edit
命令从IPython编辑这些脚本时,IPython显然将__name__
设置为'__main__'
,因此每次我退出编辑会话时都会运行代码。当从IPython编辑模块时,有没有好的方法使这些代码不运行?
发布于 2014-04-08 05:56:50
当在Emacs中工作时(我假设它与您使用%edit
获得的效果很接近),我通常使用以下技巧:
if __name__ == '__main__' and '__file__' in globals():
# do what you need
由于显而易见的原因,__file__
只为import
编写的模块定义,而不是为交互式shell定义。
发布于 2014-04-08 05:49:33
听起来您可能只需要-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
时,代码在您退出编辑器后不会执行。
发布于 2014-04-08 05:45:34
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"
https://stackoverflow.com/questions/22923002
复制相似问题