質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

エスケープ処理

エスケープ処理とは、一連の文字や一文字に対して、一定の規則に従って別の意味を適用する処理過程です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1725閲覧

ANSIエスケープでキー入力を無視したい

movswr

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

エスケープ処理

エスケープ処理とは、一連の文字や一文字に対して、一定の規則に従って別の意味を適用する処理過程です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2021/03/31 10:23

Python

1sys.stdout.write('\033[2h') 2time.sleep(3) 3sys.stdout.write('\033[2l')

sleep中のキー入力を無視(禁止)したいのですが、このコードではだめでした。何が問題なのでしょうか?

このコードだと、sleep中に入力した文字は表示され、さらに割り込みとして次のプロンプトに自動入力されてしまいます。どちらも阻止したいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まず。エスケープシーケンスってのは何に効くのかというと、端末装置です。まぁ、いまどきは「プログラム」になってしまっているでしょうけれど。エスケープシーケンスが効くかどうかは端末がそのエスケープシーケンスに対応しているかどうか次第。あなたが使っている端末プログラムはそのエスケープシーケンスに対応しているのですか? (私はそのシーケンスを知りませんが...ちょっと調べても出てこないなぁ...)

端末装置に入力を停止するシーケンスがあるとは限らないので、次の入力を始めるまえに標準入力のバッファをクリアしちゃう、という手段が使われます。Cだと(非標準だけど大抵使える)fflush(stdin);なんですが...pythonだと、termios.tcflush(stdin,TCIFLUSH)となるのかな。私は使ったことはないですけれど。

投稿2021/03/31 11:40

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

movswr

2021/03/31 11:56

おっしゃる通りでした。バッファを消す方法を主にシーケンス以外の方法も探してみます。ちなみにこのエスケープの略号はKAMで\033[Pn hという引数です。こちらのサイトに載っていましたhttp://nanno.dip.jp/softlib/man/rlogin/ctrlcode.html。
pepperleaf

2021/03/31 12:07

入力を禁止しても端末が勝手にバッファリングする場合もあります。その場合、意味無し。 バッファのフラッシュが一般的では?
movswr

2021/03/31 12:09

@pepperleaf そうなのですか、バッファのフラッシュで対応してみます。
movswr

2021/03/31 12:13

エスケープシーケンスはOSに格納されているわけではないんですか?初心者ですので理解が曖昧です。端末に対応しているエスケープシーケンスを確認したいのですが、どこを参照すればよいでしょうか?
pepperleaf

2021/03/31 12:26

エスケープシーケンスは端末依存です。今、端末と言ってもピンとこない人が多いと思いますが、昔は、シリアルケーブルとかで接続されていました。当然、種類は色々。有名どころで VT-100。 接続I/Fがシンブルなので、エスケープシーケンスというバイト列を送る事で、端末制御を行ったという事。当然ながら、端末毎に機能が違います。 ところで、Pythonという事は、WindowsとかのPCで動かすのでしょうか? 別の方法を探すべきです。(すぐに方法が浮かばないのですが、、)
movswr

2021/03/31 12:43

そうなのですね。WIndowsですが、ubuntu(WSL)のコンソール上でpython3を実行しています。
thkana

2021/03/31 12:59

それじゃ、そのエスケープシーケンスには対応していないのでは。先のはrlogin(というプログラム)が対応しているシーケンスでしょう? WSLでbashを使ってどこまで対応しているかは調べないとわからないけど。 http://nanno.dip.jp/softlib/man/rlogin/ 「RLoginは、Windows上で動作するターミナルソフトです」だそうだから、これでUbuntuに繋いだら期待の動作をするかも知れませんね。
movswr

2021/03/31 13:13 編集

たしかにrloginというプログラムのものでした。調べが甘かったです。 もう一つ気になるのですが、端末依存の端末って今でいうとどこの部分ですか?cpuやbiosの設計なのか、それともコマンドプロンプト(シェル)などのソフトの設計ですか?
thkana

2021/03/31 13:19

Windowsで言えばそのrloginだとかteratermだとか...「文字を表示しろ」といわれたら表示する、その部分です。シェルよりも下位(ハードより)と言っていいかな。エスケープシーケンスは「文字を表示しろ」の文字に特殊な機能を持たせただけですから。
movswr

2021/03/31 13:32

ありがとうございます、少し分かった気がします。今調べてみたら、ANSIのECMA48という規格で定められていて、windowsPCやunixが動くシステムは基本的にecma48を採用しているので同じエスケープシーケンスが動くという理解でいいですかね
thkana

2021/03/31 23:16

ANSIエスケープシーケンスに準拠していれば、「同じエスケープシーケンスが動く」という期待をしてもいいのでしょうね。ただ、「準拠」っていう言葉が「完全ではない」というニュアンスを含んだりするのが怖いところです。 もうひとつ、「準拠していれば」なので、そもそもANSIエスケープシーケンスなんて知らないよ、というシステムでは当然動きません。Windowsのコマンドプロンプト環境ではエスケープシーケンスが動きませんでした(Unix環境ツールのCygwin等は表示ルーチン側で処理をしていました)。Windows10になってモード切替すれば動くようになりましたけれど。
movswr

2021/04/01 03:31

そうなんですね、まあ主にlinux環境で使おうと思うので問題なさそうです
guest

0

特定の時間キーを無視して、標準出力に表示しないプログラムを作成しました。
意図があっているのであれば、参照して見てください!

python3

1import sys 2import termios 3import time 4import sys, select 5 6 7def sleep_ignore_key(sec): 8 fd = sys.stdin.fileno() 9 old = termios.tcgetattr(fd) 10 new = termios.tcgetattr(fd) 11 new[3] &= ~termios.ICANON 12 new[3] &= ~termios.ECHO 13 14 15 termios.tcsetattr(fd, termios.TCSANOW, new) 16 17 18 now_time = time.time() 19 while(1): 20 (r, w, e) = select.select([sys.stdin],[], [], 0) 21 if (len(r) == 1): 22 ch = sys.stdin.read(1) 23 24 end_time = time.time() 25 if (now_time + 3 < end_time): 26 break 27 28 29 30 termios.tcsetattr(fd, termios.TCSANOW, old) 31 32 33sleep_ignore_key(3) 34 35 36

こちらの記事を参考にしました。

https://qiita.com/tortuepin/items/9ede6ca603ddc74f91ba

投稿2021/03/31 13:46

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

movswr

2021/03/31 14:10

回答ありがとうございます!こんなやり方もあるんですね、とても参考になりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問