2012-03-09 6 views
1

Djangoのmanager.pyの出力STDOUTまたはSTDERRではないプログラム出力?

> ./manage.py runserver 0.0.0.0:2869 
Validating models... 

0 errors found 
Django version 1.3.1, using settings 'polling.settings' 
Development server is running at http://0.0.0.0:2869/ 
Quit the server with CONTROL-C. 
Error: That port is already in use. 

> ./manage.py runserver 0.0.0.0:2869 >stdout 2>stderr 

> cat stderr 
Error: That port is already in use. 

> cat stdout 

> 

私はセカンドランで出力をキャプチャしようとすると、なぜ私は空の文字列を取得していますを捕獲しようとしたとき、私はいくつかの本当に奇妙な行動を取得していますか?

答えて

2

すべてのプログラムは、そのSTDOUTおよび/またはSTDERRが端末に接続されているかどうかを検出できました:男性isatty(3)。 Pythonには、sys.stdout.isatty()などの機能もあります。

おそらく、Pythonスクリプトまたはそのロギングサブシステムは、端末上で実行されている場合、つまり対話モードでのみ、2番目の実行で欠落している行を表示します。これは一般的で適切な方法です。たとえば、出力がログファイルにリダイレクトされた場合は、"Quit the server with CONTROL-C"を出力する意味はありません。以下は

簡単な図である。

ここ
#!/usr/bin/python 

import sys 

print "Print always." 
if sys.stdout.isatty(): 
    print "Print only on tty!" 

私達は行く:このような場合には

$ ./test.py 
Print always. 
Print only on tty! 
$ ./test.py > log 
$ cat log 
Print always. 
$ 
+0

はどうやって検出することができましたか?プログラムを呼び出してisatty()をtrueに設定する方法はありますか? (私はそれがこれを設定するBashのようなものだと仮定します) 出力には少なくとも「スヌープ」の方法がありますか? – Sandro

+0

私はかなり確信しています。スクリプトを読むことでチェックすることができます。たとえば、サーバが "' 'で実行されている文字列を見つけ、それがどのように表示されるかを調べることができます。 'sys.stdout.isatty()'のテストがありますか、print()の代わりに何らかのlog()を使用しています。そうであれば、 'log()'コードなどを探します。 isatty()を何かに設定することはできません - システムはそれを行います。そしてあなたができることは何もありませんし、スヌープすべきでもありません。スクリプトは出力がファイルにリダイレクトされたときに**その行を出力しません。出力がリダイレクトされているかどうかを検出するだけです。 –

+0

@Sandro上記をすべて説明する答えを更新しました... –

関連する問題