問題タブ [python-curses]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Python Curses: プログラムをすばやく終了する
curses モジュールを使用する無限ループで Python プログラムをすばやく終了する最良の方法は何ですか?
ループの最後にこれと結合した nodelay() メソッドを追加しようとしました:
ただし、ループの 1 回の反復ですべての関数呼び出しを行うには 2 ~ 3 秒かかります。また、アプリケーションのために、5 秒ごとよりも頻繁にループを実行しても意味がありません。これは、プログラムを終了する方法が機能するために、「q」を 2 ~ 8 秒間押し続ける必要があることを意味します。
私のコードは次のようになります。
私の他の解決策は、 while True を次のように置き換えることでした。
この方法では、プログラムを終了するために「q」を押し続ける必要はありません。ただし、「q」を 1 回押した後、終了するまでに最大 8 秒かかる場合があります。
明らかな理由から、これはプログラムを終了する最良の方法ではないようです。私は、より良い(より速い)解決策があるはずだと確信しています。
それ以外は、プログラムは正常に動作します。これは 2 つのファイルで 300 行以上あるため、コードの関連部分だけを試した解決策とともに投稿しています。
python - インタラクティブなpythonアプリケーションからcdコマンド(サブシェル?)にstdoutを渡す
またはstdout
などのコンソール GUI を起動するインタラクティブな Python スクリプトを使用して、を引き継ぐ場合。いくつかのアクションを実行してループを閉じた後、で印刷されたパスに移動するにはどうすればよいですか?curses
urwid
cd
stdout
例えば、
q
実行時にまたはを押してループQ
を終了する場合:urwid
これが にのみ出力する単純な python スクリプトであればstdout
、cd $(python simple_script.py)
. ただし、上記の場合、python サブシェルがstdout
入力のハイジャックと処理に失敗するため、これはハングします。
ファイルに書き込まずにこれを回避することは可能ですか?
python - curses を使用してコンソールに複数の列を簡単に表示する方法は?
curses を使用して複数の列でコンソールにデータを出力したいと思います。そうするための簡単なアプローチは何ですか?
現在、私のアプリケーションは次のような情報を出力します。
これにより、次の出力が得られます
ただし、私が持ちたいのは次のようなものです。
結果は次のようになります。
これを達成する簡単な方法は何ですか?line 1
、line 11
、 、 、 、 、 、 、 、 、 、 、 line 21
、line 2
、line 12
、line 22
、 、などの順序で反復するためにイテレータを使用し、空白を取得するためにline 3
使用する必要がありますか?line.ljust(30, " ")
または、curses で複数の画面を作成する必要がありますか?
他にもっと単純な解決策はありますか?
私は呪いにかなり慣れていないので、一般的なアドバイスと例は素晴らしいでしょう。
python - Python スクリプトを長時間実行するとクラッシュする
Raspberry Pi 3 で python 2.7 スクリプトを実行しています。
基本的には、UART を介してチップにメッセージを送信し、応答メッセージを取得し、ログ ファイルを更新して、UI (python curses によって作成されたモニターに表示される UI) に出力します。これは 1 秒ごとに行われます。
スクリプトには 32 時間実行されているバグがなく、その後クラッシュします。UI がクラッシュし、「shsh を開けません: 共有ライブラリの読み込み中にエラーが発生しました: libc.so.6 : 共有オブジェクト ファイルを開けません...」というエラー メッセージが表示されます。 Python スクリプト
Raspberry Pi のメモリ状態を確認しました。Python プロセスは、32 時間目に総メモリの約 1/4 を使用します。したがって、クラッシュの原因はメモリではありません。また、モニターなしで実行しようとしましたが、python.curses なしで偽の UI クラスを起動します。同じクラッシュが 32 時間目に発生しました。
さて、スクリプトがクラッシュする理由がわかりません。
python - Pythonの呪い:Pool.mapのマルチプロセッシングの問題?
のモジュールとPool.map
の組み合わせに問題があります。UI ブレークでより大きなワークロードを計算すると、デフォルトの画面に反応しなくなります。押されたキーを即座に読み取る (そして解析を続行する) 代わりに、Enter キーを押すまで任意の数のキーを押すことができます。時々 (それに加えて) UI が壊れることさえあります (通常のシェルの一部を表示するなど)。curses
Python
Pool.map
curses
getch
Curses UI ラッパー
Screen
これは、curses UI を処理するラッパー クラス ( ) です。
実際のプログラム
Pool.map
上記の失敗は、UI 内で結合し、curses
ワークロードが高い場合に常に発生するため、小さな例を作成しました。このコードは、配列で役に立たないものをmult
計算するだけです。add
numpy
ここで、ワークロードが高いコードを実行すると (つまり、形状の配列をクランチする(8, int(1e7)
と、10,000,000 列の 8 行に相当します)curse
がgetch
中断し、次の動作が発生します。
q
ご覧のとおり、何度でも (または他のキーを)curse
叩くことができますが、getch
は反応しません。入力を認識させるには、Enter キーを押す必要があります。
さらに、何らかの理由で最初の行が元のシェルの出力で上書きされます。
この動作は、おおよそ の計算にPool.map
1 秒以上かかる場合にのみ発生します。
data_arr
すべてが魔法のように機能するような小さな配列に設定するnp.random.rand(8, 100)
と、計算に1秒以上かかる大きな配列をフィードするとすぐに、この奇妙なバグが現れてcurses
UIが壊れます。
何か案は?
Pool.map
どういうわけかワーカープロセスに正しく参加していませんか?
python - Python cursesで入力文字列の有無にかかわらずサブウィンドウをエスケープするにはどうすればよいですか?
Python curses では、scr.subwin() を使用してサブウィンドウを描画し、以下のように getstr() 関数で入力を取得するとします。
そして、私は何の入力も提供しないことにしました。新しいサブウィンドウをエスケープするにはどうすればよいですか?
ありがとう