2011-07-06 50 views

回答

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,但是当我试图寻找到它找到加载为了让我回到我的答案第一部分的链接。

+0

该代码不再在pydoc(检查日期...)和sitecustomize中的堆栈帧在交互模式和非交互模式之间没有区别。不过值得一试。 – jtniehof

+0

突然意识到,对于您的情况,有一个令人惊讶的简单解决方案。再次看到我的答案。 – JAB

+0

我想不出一个好的方法来处理这个问题,而不用踩在用户的PYTHONSTARTUP上,但它让我看着那个代码......看到我的答案。 – jtniehof

1

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),但做这项工作。

+0

很高兴你能找到一种能够按照你想要的方式工作的解决方案。 – JAB

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. 
+0

这只会检查是否在命令行上指定了-i ......如果解释器是“裸露”的,它仍然会将其置于交互模式下,从而失败。 – jtniehof