2011-07-06 23 views
1

私はインタプリタの起動時に表示されるMOTDタイプのメッセージを持っています。現在のところ、これはsitecustomizeでプリントされています。インタプリタがインタラクティブモードでない場合、メッセージを抑制したいと思います。残念ながら、 Tell if Python is in interactive modeのすべてのチェックはsitecustomizeでは機能しません。 (sys.argvsys.ps1__main__.__file__は入力されていません)。sitecustomizeで動作するチェックはありますか?sitecustomizeでpythonの対話モードを確認してください

答えて

1

おそらくこのアイデアinspectモジュールを利用し、チェックがフレームはあなたにいくつかの使用であるかもしれないスタックインタプリタの対話チェックするために:

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

をまたpydoc.help()のソースを直接見てみてください可能性があり、その上にリンクされたコードスニペットに触発されました。


はちょうどあなたが単にPYTHONSTARTUP環境変数を使用して対話プロンプトを含むファイルを利用することができることに気づきました。 PYTHONSTARTUPが指すファイル内のコマンドは、インタプリタが対話形式で実行されている場合にのみ実行されます。あなたは、Pythonの外で環境変数を設定したくない場合は、あなたがsitecustomize.pyで目的のファイルに変数を設定することができるかもしれない

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

、しかし、ときに私はロードを見つけるためにそれを検討してみました私の答えの最初の部分から私はリンクに戻ってきました。

+0

このコードは、もはやpydoc(日付をチェックしてください...)でなく、sitecustomizeのスタックフレームは対話モードと非対話モードの違いがありません。しかし、チェックの価値があった。 – jtniehof

+0

あなたの状況には、驚くほど簡単な解決策があることが突然認識されました。私の答えをもう一度見てください。 – JAB

+0

私は、ユーザーのPYTHONSTARTUPを踏むことなくそれを処理する良い方法は考えられませんでしたが、そのコードを見ていました...私の答えを見てください。 – jtniehof

1

JABは、コードを見て私を得たと私は最終的にはこの思い付いた:(とPy3kためc_char_pはc_wchar_pする必要があります)

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 

ちょっと醜いが、仕事をしていません。

+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が指定されているかどうかをチェックするだけです。インタプリタがインタラクティブモードにしても "bare"を開始した場合は失敗します。 – jtniehof

関連する問題