检测python脚本是从ipython shell运行还是从命令行运行

Fil*_* S. 6 python matplotlib ipython

有没有办法检测python脚本是从python或ipython shell运行,还是从命令行运行,例如python scrip.py

我想使用它来设置我的matplotlib环境,并根据脚本的运行方式保存或显示数字.当我从命令行运行绘图脚本时,我希望脚本使用非标准的matplotlib后端并将图形保存到文件中plt.savefig(),但如果我从ipython shell中运行它In [1]: run scrip.py,我希望使用显示图形plt.show().

像这样的东西:

import matplotlib
if run_from_command_line:
    matplotlib.use("non-standard-backend")

import matplotlib.pyplot as plt
if run_from_interactive_shell:
    plt.ion() // Turn on interactive mode in matplotlib

// Do plotting

if run_from_command_line:
    plt.savefig(filename)
else:
    plt.show()
Run Code Online (Sandbox Code Playgroud)

eba*_*arr 12

方法1

在IPython中运行时,会有一个名为的全局变量集__IPYTHON__.你可以检查一下它是否存在:

try:
    __IPYTHON__
except NameError:
    print "Not in IPython"
else:
    print "In IPython"
Run Code Online (Sandbox Code Playgroud)

方法2

正如这个线程指出的那样,您还可以get_ipython在脚本中查找该函数,不仅可以检查您是否从IPython运行,还可以检查IPython的配置.

方法3

您还可以使用inspect模块检查堆栈,并确定您是否从交互式解释器等运行.

所以一个示例文件:

# test.py
import inspect

for frame in inspect.stack():
    print frame
Run Code Online (Sandbox Code Playgroud)

从命令行运行时python test.py输出为:

(<frame object at 0x100378530>, 'test.py', 3, '<module>', ['for frame in inspect.stack():\n'], 0)
Run Code Online (Sandbox Code Playgroud)

execfile来自交互式口译员:

>>> execfile( "test.py" )
(<frame object at 0x1003795e0>, 'test.py', 3, '<module>', ['for frame in inspect.stack():\n'], 0)
(<frame object at 0x100379430>, '<stdin>', 1, '<module>', None, None)
Run Code Online (Sandbox Code Playgroud)

在IPython中运行时:

In [1]: %run test
(<frame object at 0x1029002a0>, '/Users/ebarr/Scripts/SO/test.py', 3, '<module>', ['for frame in inspect.stack():\n'], 0)
(<frame object at 0x102900020>, '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/utils/py3compat.py', 224, 'execfile', ['            builtin_mod.execfile(filename, *where)\n'], 0)
(<frame object at 0x101d78e20>, '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/core/interactiveshell.py', 2537, 'safe_execfile', ['                py3compat.execfile(fname,*where)\n'], 0)
(<frame object at 0x101d78c30>, '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/core/magics/execution.py', 703, 'run', ['                                       exit_ignore=exit_ignore)\n'], 0)
(<frame object at 0x101d76390>, '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/core/magics/execution.py', 717, 'run', ['                            run()\n'], 0)
(<frame object at 0x101d61760>, '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/core/magic.py', 193, '<lambda>', ['        call = lambda f, *a, **k: f(*a, **k)\n'], 0)
(<frame object at 0x101d761a0>, '<string>', 2, 'run', None, None)
(<frame object at 0x101d603e0>, '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/core/interactiveshell.py', 2126, 'run_line_magic', ['                result = fn(*args,**kwargs)\n'], 0)
(<frame object at 0x101d5f1f0>, '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/core/interactiveshell.py', 2205, 'magic', ['        return self.run_line_magic(magic_name, magic_arg_s)\n'], 0)
(<frame object at 0x101d75e40>, '<ipython-input-1-59a1e9768ae2>', 1, '<module>', [u"get_ipython().magic(u'run test')\n"], 0)
(<frame object at 0x101d75990>, '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/core/interactiveshell.py', 2883, 'run_code', ['                exec(code_obj, self.user_global_ns, self.user_ns)\n'], 0)
(<frame object at 0x101d75760>, '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/core/interactiveshell.py', 2833, 'run_ast_nodes', ['                if self.run_code(code):\n'], 0)
(<frame object at 0x101d71950>, '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/core/interactiveshell.py', 2741, 'run_cell', ['                                   interactivity=interactivity, compiler=compiler)\n'], 0)
(<frame object at 0x101d6ce10>, '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/terminal/interactiveshell.py', 567, 'interact', ['                    self.run_cell(source_raw, store_history=True)\n'], 0)
(<frame object at 0x101d6c870>, '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/terminal/interactiveshell.py', 443, 'mainloop', ['                    self.interact(display_banner=display_banner)\n'], 0)
(<frame object at 0x101716d60>, '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/terminal/ipapp.py', 371, 'start', ['            self.shell.mainloop()\n'], 0)
(<frame object at 0x1017006f0>, '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/config/application.py', 563, 'launch_instance', ['        app.start()\n'], 0)
(<frame object at 0x1014fbdd0>, '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/__init__.py', 118, 'start_ipython', ['    return launch_new_instance(argv=argv, **kwargs)\n'], 0)
(<frame object at 0x100378560>, '/Library/Frameworks/Python.framework/Versions/2.7/bin/ipython', 11, '<module>', ['    sys.exit(start_ipython())\n'], 0)
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考:如果脚本是使用`ipython scrip.py`在命令行中运行,还是使用`[[]:run scrip.py`和`get_ipython()`在ipython shell中运行,则可以设置`__IPYTHON__`变量。在两种情况下都返回相同的内容(末尾的内存地址除外)。但是inspec模块似乎可以解决问题。 (2认同)