在sitecustomize中检查python交互模式

时间:2011-07-06 17:30:28

标签: python

我有一个MOTD类型的消息,它在解释器的调用时打印。目前,这是在sitecustomize中打印出来的。如果解释器不处于交互模式,我想压缩消息;不幸的是所有的检查 Tell if Python is in interactive mode在sitecustomize中不起作用。 (sys.argvsys.ps1__main__.__file__未填充。)是否有在sitecustomize中工作的检查?

3 个答案:

答案 0 :(得分:2)

JAB让我看着代码,我最终想出了这个:

import ctypes
import getopt

ctypes.pythonapi.Py_GetArgcArgv.restype = None
ctypes.pythonapi.Py_GetArgcArgv.argtypes = [
    ctypes.POINTER(ctypes.c_int),
    ctypes.POINTER(ctypes.POINTER(ctypes.c_char_p))]
count = ctypes.c_int()
args = ctypes.pointer(ctypes.c_char_p())
ctypes.pythonapi.Py_GetArgcArgv(ctypes.byref(count), ctypes.byref(args))
argc = count.value
argv = [args[i] for i in range(count.value)]
if argc > 1:
    interactive = False
    opts, args = getopt.getopt(argv[1:], 'i')
    for o, a in opts:
        if o == '-i':
            interactive = True
else:
    interactive = True

有点难看(对于Py3k,c_char_p需要是c_wchar_p),但是做了这个工作。

答案 1 :(得分:1)

也许这种用于检查利用inspect模块并检查堆栈帧的解释器交互性的想法可能对您有用:

http://mail.python.org/pipermail/pythonmac-sig/2002-February/005054.html

您还可以尝试直接查看pydoc.help()的来源,上面链接的代码段受到启发。


刚刚意识到您可以使用包含交互式提示的文件和PYTHONSTARTUP环境变量。 PYTHONSTARTUP指向的文件中的命令只有在交互式运行解释器时才会执行。

http://docs.python.org/tutorial/interpreter.html#the-interactive-startup-file

如果您不想在Python之外设置环境变量,您可以将变量设置为sitecustomize.py中的所需文件,但是当我尝试查找它以查找加载顺序时从我回答的第一部分开始,我直接回到了链接。

答案 2 :(得分:1)

检查sys.flags是一种更简洁的方法。

>>> import sys  
>>> sys.flags.interactive  
1

注意,IDLE本质上也是交互式的,但是没有设置标志。我会在下面做:

>>> if sys.flags.interactive or sys.modules.has_key('idlelib'):  
>>>     pass # do stuff specific to interactive.