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