【问题标题】:tell whether python is in -i mode判断python是否处于-i模式
【发布时间】:2010-10-13 00:39:52
【问题描述】:

如何判断 python 是否已使用 -i 标志启动?

根据the docs,可以查看os.environ中的PYTHONINSPECT变量,也就是-i的等价。但显然它的工作方式不一样。

作品:

$ PYTHONINSPECT=1 python -c 'import os; print os.environ["PYTHONINSPECT"]'

不起作用:

$ python -i -c 'import os; print os.environ["PYTHONINSPECT"]'

我问的原因是因为如果某些条件失败,我有一个调用 sys.exit(-1) 的脚本。这很好,但有时我想使用 -i 手动调试它。我想我可以学习使用“PYTHONINSPECT=1 python”而不是“python -i”,但是如果有一种通用的方法会很好。

【问题讨论】:

    标签: python


    【解决方案1】:

    如何以编程方式设置检查模式

    the link@Jweede provided 的答案不准确。应该是:

    import os
    os.environ['PYTHONINSPECT'] = '1'
    

    如何检索是否设置了交互/检查标志

    @Brian's answer 的另一个变体:

    import os
    from ctypes import POINTER, c_int, cast, pythonapi
    
    def in_interactive_inspect_mode():
        """Whether '-i' option is present or PYTHONINSPECT is not empty."""
        if os.environ.get('PYTHONINSPECT'): return True
        iflag_ptr = cast(pythonapi.Py_InteractiveFlag, POINTER(c_int))
        #NOTE: in Python 2.6+ ctypes.pythonapi.Py_InspectFlag > 0
        #      when PYTHONINSPECT set or '-i' is present 
        return iflag_ptr.contents.value != 0
    

    查看 Python 的main.c

    【讨论】:

      【解决方案2】:

      我看了一下源码,虽然提供-i时设置的变量存储在Py_InteractiveFlag中,但看起来并没有暴露给python。

      但是,如果您不介意通过一些低级 ctypes 检查让您的手有点脏,我认为您可以通过以下方式获得价值:

      import ctypes, os
      
      def interactive_inspect_mode():
          flagPtr = ctypes.cast(ctypes.pythonapi.Py_InteractiveFlag, 
                               ctypes.POINTER(ctypes.c_int))
          return flagPtr.contents.value > 0 or bool(os.environ.get("PYTHONINSPECT",False))
      

      [Edit] 修复错字并检查 PYTHONINSPECT(它不设置变量),如 cmets 中所指出的。

      【讨论】:

      • InteractiveFlag 忽略 PYTHONINSPECT 环境变量。
      • 谢谢,我已修正错字,并添加了对环境变量的检查。
      • 值得一提的是 Py_InspectFlag (Python 2.6+)。如果存在“-i”或设置了 PYTHONINSPECT 并且不为空,则它 > 0。添加源链接svn.python.org/view/python/trunk/Modules/main.c?view=markup
      • 有趣 - 我正在查看 2.5 源代码,它缺少此标志,但它看起来更适合更高版本的标志。但是它确实错过了在 python 启动后由 python 代码设置 PYTHONINSPECT 的情况,因此可能仍然需要进行 env 检查。
      • os.environ 检查绝对是必需的。 main.c 中有Py_InspectFlag = 0;
      【解决方案3】:

      【讨论】:

      • 我想判断它是否已经处于交互模式,而不是设置它
      • 哎呀。对不起,你问题的最后一部分让我失望了。 :-)
      猜你喜欢
      • 2011-01-22
      • 1970-01-01
      • 2011-03-09
      • 2014-11-13
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多