Cygwinを最近再インストールした後、奇妙な動作が発生しました。実行中のアプリケーションからのターミナル出力は、書き込まれたときに表示されませんが、特定の条件下で突然表示されます。
私の特定の状況では、Djangoサーバー:
python manage.py runserver
これにより、サーバーが起動したときにターミナルにいくつかのステータスメッセージが出力され、サーバーの要求と応答も表示されます(Python print
ステートメントに加えて))。現れています。
ただし、Djangoアプリの一部であるファイルを変更すると、サーバーが自動的に再起動し(必要に応じて)、前のセッションのすべての出力が突然表示されます。
Cygwinの以前のインストールは正常に機能しました。
私が持っている唯一の既知の違いは、Cygwinを使用した以前のインストールPython(in /usr/bin
)私の新しいインストールではWindows Pytonを使用しています(/cygdrive/c/Python27
)。これは、MySQLデータ接続の目的で行われました。
さらに奇妙なことに、より大きな問題を指摘しているかもしれませんが、サーバーを実行した後、Cygwinはターミナルウィンドウを閉じるために閉じるボタン(右上の「X」)を2回クリックする必要があります。最初のクリックで端末は役に立たなくなりますが、ウィンドウ自体は残ります。 2回クリックすると、画面から削除されます。
Cygwinが端末出力を更新しておらず、便利な修正を見つけたという状況に遭遇した人はいますか?
ここでの問題は、さまざまなPythonインストールとPythonの「フラッシュ」動作の組み合わせです。
フラッシュとは、メモリからファイルまたは画面に何かを書き込むことを指します。適切に設計されたプログラムが画面に何かを書き込んでいるとき、それを検出してすぐに画面に書き込む(「フラッシュ」)ので、すぐに見ることができます。ただし、プログラムがディスク上のファイルに書き込んでいる場合、ファイルに小さな書き込みをたくさん行うのは、大きなものを1つ作成するよりもはるかに遅いため、ファイルにフラッシュするチャンクができるまで、小さな書き込みを「バッファリング」します。一度。これはPythonが行うことです。
あなたが見ている問題は、CygwinのPythonはMinTTYがターミナルであることを理解しているので、頻繁にフラッシュすることですが、Windows PythonはMinTTY端末とディスク上のファイルの違い。書き込み先がファイルであると想定しているため、各メッセージを表示どおりにフラッシュするのではなく、書き込みをキューに入れてバッチでフラッシュします(アプリを再起動するとこれがトリガーされます)。十分に長く(推測では、64kb相当のメッセージがキューに入れられるのに十分)待機すると、それらすべてが一度に画面に書き込まれるのもわかります。
2つの解決策があります。CygwinPythonを使用できるようにMySQLの問題を回避する方法を見つけるか、Windows cmdShellからWindows Pythonを使用します。これは、ターミナルとして正しく検出されます。したがって、正しいフラッシング動作を生成します。
Pythonのバッファリング動作を無効にする運もあるかもしれません。 _-u
_オプションを指定してPythonを実行するか、printステートメントの後にsys.stdout.flush()
を追加すると、Pythonのバッファリングが妨げられます)メッセージを送信し、すぐに画面に表示します。