GNU/Linux >> Linux の 問題 >  >> Linux

raw モードの Python stdin print でスペースが追加されます

改行だけを行っているように見えますが、改行はしていません。プリントを

に変更
print("ASD", end="\r\n")

あなたが経験している問題は、'raw'、'cooked'、'cbreak' モードの違いです。これらのモードはカーネル レベルのターミナル ドライバーのモードであり、アプリケーション コードや標準ライブラリなどのユーザー空間のモードではありません。これは、これらを参照する昔ながらの Unix の方法です。 Posix はそれらをはるかにきめ細かい属性セットに置き換えましたが、Posix 属性は通常、古い「raw」、「cooked」、および「cbreak」モードを模倣する方法でヘルパー関数と連携して反転されます.

cooked モードでは、ターミナル ドライバ自体にプリミティブな行編集機能が組み込まれています。バックスペース、単語の消去 (基本的に単語全体を一度にバックスペースする) などを処理します。矢印キーや履歴などの処理ほど洗練されたものはありません。とても原始的。このモードでは、プログラムは行末 (eol) 文字が送信されるまで端末から何も認識しません。その後、プログラムは行全体を取得し、行末は Unix 標準の 05 端末が実際に何をするかに関係なく。また、この一環として、ターミナル ドライバは入力された文字をターミナルにエコー バックするため、ユーザーは入力内容を確認できます。

「cooked」モードでは、カーネル レベルのターミナル ドライバも出力の変換を行います。その一部が 13 になっています 26

また、「cooked」モードでは、ターミナル ドライバは、Control-C (制御プロセス グループに SIGINT を送信する (CPython によって KeyboardInterrupt 例外に変換される)) や Control-Z (SIGTSTP を送信する (SIGSTOP のようなものですが、キャッチすることができます) を制御するプロセス グループに).

「cbreak」モードでは、行の編集は行われなくなりました。ターミナル ドライバは、各文字 (または矢印キーのエスケープ シーケンスのような短い文字列) をプログラムに即座に渡します。これらの文字は画面にエコーされないため、プログラムがそれらを印刷しない限り、ユーザーには表示されません。ターミナル ドライバは、Control-C や Control-Z などの特殊文字を引き続き処理しますが、バックスペースや単語消去文字 (通常は Control-W) などの行編集文字を処理しなくなります。また、一部の出力処理がまだ行われているため、ドライバーは 38 を返します 45 に .

「raw」モードでは、入力にも出力にも処理は行われません。特殊文字の処理なし、エコーなし、変換なし 55 62 に 、Control-Zの処理なし、何もありません。端末を raw モードにしてすべてを実行するのは、プログラム次第です。

ここで、70 の属性を設定しています したがって、これは 85 には影響しないはずだと思うかもしれません .しかし、実際には、両方のファイル記述子が端末ドライバーのまったく同じ「インスタンス」につながります。そして、何が起こるかを決定するのはターミナルドライバーの設定です。したがって、これらの設定を 99 まで変更しても問題ありません 、 101 、または 114 、すべて同じ基本的なターミナル ドライバー インスタンスを変更し、他のすべてに影響を与えます。

これはもちろん、プログラムが起動される前にシェルによってリダイレクトされたファイル記述子には当てはまりません。

補足として、 121 を使用できます コマンド ラインでこれらのフラグのすべてを完全に読み取ることができます (cooked および cbreak モードでどの制御文字がどのシグナルになるかを含む)。


この同じ質問に対する答えを探していたときに、Google が私をここに連れてきました。改行なしのハレックスによって共有された手がかりは、真実を探すのに役立ちました. Chris の Wiki の投稿 (https://utcc.utoronto.ca/~cks/space/blog/unix/CBreakAndRaw) で答えを見つけたので、ここで tty.py のソースを読むようになりました:https://hg. python.org/cpython/file/618ea5612e83/Lib/tty.pyこれにより、目標が単一の文字を読み取ることである場合、次の代わりにという結論に達しました:

tty.setraw()

用途:

tty.setcbreak()

Linux
  1. Linux – Rawキーボードモード?

  2. どのターミナルエミュレータがTmux制御モードをサポートしていますか?

  3. ターミナルにVimキーバインディングを設定することは可能ですか?

  1. Mac ターミナル vi[m] エディタ コマンド

  2. stdin は端末ではないため、疑似端末は割り当てられません

  3. Python raw ソケット:プロトコルがサポートされていません

  1. LinuxターミナルでJSONファイルをきれいに印刷する方法

  2. root 権限なしで Python で raw ソケットを作成する

  3. ls ですべてを 1 行に出力するようにします (ターミナルのように)