2011-07-06 71 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