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

标签 python matplotlib ipython

有什么方法可以检测 python 脚本是从 python 或 ipython shell 运行,还是从命令行运行,例如 python scrip.py

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

最佳答案

方法一

在 IPython 中运行时,有一个名为 __IPYTHON__ 的全局变量集。您可以通过以下方式检查是否存在:

try:
    __IPYTHON__
except NameError:
    print "Not in IPython"
else:
    print "In IPython"

方法二

因为这个thread指出您还可以在脚本中查找 get_ipython 函数,不仅可以检查您是否从 IPython 运行,还可以检查 IPython 的配置。

方法三

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

示例文件:

# test.py
import inspect

for frame in inspect.stack():
    print frame

当使用 python test.py 从命令行运行时,输出为:

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

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)

在 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)

关于python - 检测 python 脚本是从 ipython shell 运行,还是从命令行运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23883394/

相关文章:

python - 将 pandas 数据框导出为交互文件 : row\t value\t col

python - 替代 scipy.optimize.curve_fit

python - 如何在 IPython 笔记本中隐藏 <matplotlib.lines.Line2D>

python - Jupyter 笔记本,如何同时运行多个单元格?

ipython - 在spyder中无法获取ipython控制台

python - 在 while 循环内延迟 (Python/Pygame)

Python 3.2.3 值错误 : could not convert string to float

python - 如何正确设置输入/输出文件的路径?

python - Matplotlib - 结合文本/注释坐标系

python - 在 Python 中安装 matplotlib 的问题