告诉python是否处于-i模式

时间:2009-03-12 20:38:47

标签: python

如何判断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”,但是如果有一种通用的方法可以做到这一点会很好。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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))

[编辑]修复拼写错误并检查PYTHONINSPECT(不设置变量),如评论中所指出的那样。

答案 2 :(得分:0)