11

少し異常な状況に遭遇しました。(教育/テスト目的で) 対話型コンソールのスクリプトを作成しようとしていますが、次のことを試しました。

$ python > /dev/null
Python 2.7.3 (v2.7.3:70274d53c1dd, Apr  9 2012, 20:52:43) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> print 3
>>> 

3印刷されていないので、明らかに他のすべてがオンになっていstderrます。ここまでは順調ですね。しかし、リダイレクトしstderrます:

$ python 2> /dev/null
>>> print 3
3
>>> 

どちらの場合もプロンプトを出力するにはどうすればよいですか?

stdout編集:両方をリダイレクトするとstderr、まったく何も印刷されません。stdoutしたがって、Python は明らかにまたは のいずれかを「選択」してstderrいます。それが起こることは文書化されていますか?これが Python ソース コードで実際にどのように行われるかわかりませんでした。

4

1 に答える 1

4

python が であるかどうかをチェックするようstdoutですtty:

/* This is needed to handle the unlikely case that the
 * interpreter is in interactive mode *and* stdin/out are not
 * a tty.  This can happen, for example if python is run like
 * this: python -i < test1.py
 */
if (!isatty (fileno (sys_stdin)) || !isatty (fileno (sys_stdout)))
    rv = PyOS_StdioReadline (sys_stdin, sys_stdout, prompt);
else
    rv = (*PyOS_ReadlineFunctionPointer)(sys_stdin, sys_stdout,
                                         prompt);

194行目あたりのソースコードParser/myreadline.c

インタープリターがreadline起動時にモジュールをインポートする可能性があります。その場合、ライブラリーを使用するPyOS_ReadlineFunctionPointerに設定されます。特に、 を呼び出します。この関数のドキュメントには、プロンプトが出力される場所は記載されていませんが、/がs であるかどうかをチェックすることは可能です。call_readlinereadlinerl_callback_handler_installstdoutstderrtty

于 2013-08-24T15:17:05.850 に答える