代码之家  ›  专栏  ›  技术社区  ›  Mr Fooz

在IPython中交互运行python脚本时检测

  •  6
  • Mr Fooz  · 技术社区  · 15 年前

    有没有一种方法可以让python脚本自动检测它是否正在交互运行?或者,是否可以检测ipython是否正在使用,而不是常规的C python可执行文件?

    背景:我的Python脚本中通常有一个exit()调用。有时,我以交互方式运行脚本以进行调试和分析,通常是在IPython中。当我以交互方式运行时,我想禁止调用退出。

    澄清 :

    假设我有一个脚本myscript.py,它看起来像:

    #!/usr/bin/python
    ...do useful stuff...
    exit(exit_status)
    

    有时,我想在已经开始的ipython会话中运行脚本,并说:

    In [nnn]: %run -p -D myscript.pstats myscript.py
    

    在脚本末尾,exit()调用将导致ipython挂起,同时询问我是否真的要退出。这是调试时的一个小麻烦(对我来说太小了,我不在乎),但它可能会破坏分析结果:退出提示包含在分析结果中(如果我在午餐前启动分析会话,会使分析变得更困难)。

    我想要的是允许我修改我的脚本,使其看起来像:

    #!/usr/bin/python
    ...do useful stuff...
    if is_python_running_interactively():
        print "The exit_status was %d" % (exit_status,)
    else:
        exit(exit_status)
    
    3 回复  |  直到 12 年前
        1
  •  13
  •   Mr Fooz    15 年前

    我绊倒了以下几点,这似乎对我有好处:

    def in_ipython():
        try:
            __IPYTHON__
        except NameError:
            return False
        else:
            return True
    
        2
  •  3
  •   Wirawan Purwanto danodonovan    13 年前

    医生说 sys.ps1 在非交互模式下不存在。另外,一个人可以使用 sys.flags (对于python 2.6+)来检测是否使用了 python -i <whatever> .

    此脚本检测我们是否以交互、非交互和事后模式运行(如果使用 python -i 隐式的和用户认为他登陆了“交互”控制台):

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    import sys
    
    # IPython recognition is missing; test here if __IPYTHON__ exists, etc.
    
    if hasattr(sys, 'ps1'):
        print "Running interactively."
    else:
        print "Not running interactively..."
        if sys.flags.interactive:
            print "... but I'm in interactive postmortem mode."
    

    如Fooz先生所述,可以添加ipython支持。

        3
  •  2
  •   William Pursell    15 年前

    当以交互方式调用时,python将在$pythonstartup中运行脚本,因此您可以简单地让该环境变量调用设置全局