タグ付けされた質問 「subprocess」

2
劣ったプロセスが長い行を生成するとき、スローダウンを防ぐ方法は?
EmacsをGeiserで使用して、Schemeコードをハックします。REPLで遊んでいると、多くの場合、すべてが1行で出力される式を評価することがあります。 たとえば、SRFI-41(ストリーム)で遊んで、大きなファイルから文字ストリームを作成しました。次に、ストリームを強制し、Geiserはファイルのコンテンツ全体を文字ストリームとしてバッファにバーフしました。ほとんどすぐに、私は保持どのくらいの出力ラインに追加、より多くの文字などの停止、そしてどんなににEmacsの地面が押すC-gかC-c C-c、私は、Emacs(またはガイザー)の停止を行うことができませんでした。 Emacsは私の入力を完全に無視するようになり、この巨大な文字ストリームをすべて1行で無反応のGeiser REPLバッファーに出力することを優先する必要があると考え、Emacsセッション全体を中断しました。 Emacsセッションを破壊的な好奇心から守るためにできることはありますか?(とにかく非常に長い行を表示するときにEmacsが非常に遅くなるのはなぜですか?)

1
comintプロセスからの出力を非同期に待機します
まず、免責事項。私はこれを何度も研究しました、そして、私はすでに何らかの方法で答えをすでに見つけたと確信していますが、私はそれを理解しません。 私の問題は次のとおりです。 comintを実行しているプロセスがあります 入力行を送信し、出力をキャプチャして、それが終了したとき(出力の最後の行がプロンプトの正規表現に一致したとき)を確認したい プロセスが出力の送信を完了したときにのみ、別の入力行を送信したい(たとえば)。 少しの背景として、プログラムとの対話を実装するメジャーモードを考えてください。プログラムは、任意の時間で任意の量の出力を返す可能性があります。これは異常な状況ではありませんよね?さて、 入力間で待機する必要がある部分は珍しいかもしれませんが、入力全体を送信するよりもいくつかの利点があります。 出力バッファはきれいにフォーマットされています:入力出力入力出力... さらに重要なことは、プロセスに大量のテキストを送信する場合、テキストは断片に分割され、その断片はプロセスによって貼り付けられます。切断ポイントは任意であり、これにより無効な入力が行われることがあります(たとえば、プロセスは識別子の途中で入力カットを正しく貼り付けません) とにかく、珍しいかどうかにかかわらず、それは複雑であることがわかります。今、私はの線に沿って何かを使用しています (defun mymode--wait-for-output () (let ((buffer (mymode-get-buffer))) (with-current-buffer buffer (goto-char (point-max)) (forward-line 0) (while (not (mymode-looking-at-prompt)) (accept-process-output nil 0.001) (redisplay) (goto-char (point-max)) (forward-line 0)) (end-of-line)))) 入力ラインを送信した後、次のラインを送信する前に毎回これを呼び出します。まあ...それは動作します、それはすでに何かです。 ただし、出力を待機しているときにemacsがハングすることもあります。その理由は明らかでありsleep-for、ループに何らかの非同期(たとえば1)を含めると、出力は1秒遅延しますが、ハングは抑制されると考えました。この種の非同期sleep-for は存在しないように見えることを除いて 。 それともそうですか?より一般的には、emacsでこれを達成する慣用的な方法はありますか?言い換えると: プロセスに入力を送信し、出力を待ってから、さらに入力を非同期に送信する方法は? 周りを検索するとき(関連する質問を参照)、主にセンチネル(プロセスが終了しないため、私の場合には当てはまらないと思います)といくつかのcomintフック(しかし、何をすべきですか?フックをバッファローカルにし、「残りの行を評価する」を関数に変え、この関数をフックに追加し、その後フックをきれいにしますか?それは本当に汚いですね?) 自分自身を明確にしない場合、またはどこかで利用可能な明らかな答えがある場合、プロセスの相互作用のすべての複雑さに本当に混乱しています。 必要に応じて、これをすべて実用的な例にすることができますが、以前に見つけて助けにならなかったすべてのような「特定のプロセスの答えを持つ特定のプロセスの質問」をもう1つ作成するだけです。 SOに関するいくつかの関連する質問: /programming//q/16815598/1083706 /programming//q/3572532/1083706 /programming//q/6578373/1083706

1
あるサブプロセスが他のサブプロセスを枯渇させないようにするにはどうすればよいですか?
明確にするために、私はemacsをマルチスレッド化する必要のあることについては何も話していません(おそらくこれも解決されるでしょう)。再現するには: emacs -Q#24.4.1を実行しています 2番目のフレームを作成する 最初のフレームに戻る MXシェル Mx rename-uniquely(後で2番目のシェルを作成します) 実行を開始: while true; do echo "hello world"; done 2番目のフレームでは、Mxシェル 2番目のシェルが表示されることはほとんどありません(まれに繰り返し試行しても機能します)。どうやらemacsは、最初のシェルの出力を読み取って他のプロセスからの出力をリッスンすることを決して中断しません。保留中の出力を持つ複数のプロセスがある場合、ラウンドロビンの方がはるかに良い動作になります。より良い行動をとる方法はありますか? 私が知っている唯一のトリックは、シェルバッファーを独自のプロセスにすることですが、残念ながらそれは私にはうまくいきません。それを行ったとしても、音声認識ソフトウェアが機能するようにソケットをリッスンするサブプロセスを実行する必要があります。そうすれば、シェルを最初に実際に制御できるようになります。これが、私がこれを発見した方法です。上記のような無限ループを実行すると、データがソケットから取り出されなくなります。

2
Emacsからssh-addを実行し、パスフレーズを入力します
ssh-addシェルコマンドを呼び出したいのですが。そこでを呼び出しM-x shell-command RET、ミニバッファーで次のように入力します。ssh-add .ssh/id_rsa 私が得る唯一のものは: ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory^M Emacsに別のプロンプトを表示させて、ssh-addが待機しているパスフレーズを入力するにはどうすればよいですか? これは、DebianのX11でのEmacsの場合です。

3
Mxコンパイルの永続的な環境
実行M-x compileすると、新しいサブシェルが生成され、コンパイルコマンドが実行されます。コンパイルコマンドが戻るとすぐに、シェルプロセスは強制終了されます。これがほとんどの場合に望ましい理由はわかりますが、現在は役に立たない状況にあります。 現在、専用のビルド環境で作業しています。コンパイラーを実行する前に、ビルドをセットアップするためにいくつかの初期手順を実行する必要があります。環境が持続する限り、セットアップ手順を1回だけ実行する必要があります。しかし、それを使用M-x compileすると、コンパイルまたは再コンパイルするたびに手順を実行する必要があることを意味します。 バックグラウンドで持続するサブシェルを生成する方法はありますか?一つM-x compileとM-x gdb彼らはシェルプロセスを実行する必要があるたびに使用することができますか? 動機: xcc特別なプラットフォーム用のCコードをビルドするプログラム(これをと呼びます)があります。コードをビルドするには、まずプロンプトxccから始めtcshます。 $ xcc プログラムの読み込みに10秒以上かかり、インタラクティブプロンプトでコマンドを入力できます xcc>> add target myprogram xcc>> set source myprogram $PROJDIR/src/ xcc>> set includes myprogram $PROJDIR/include/ xcc>> set type myprogram primitive xcc>> set inputs myprogram int8,int8 xcc>> set outputs myprogram fix16,fix16 xcc>> build myprogram 上記の手順はカスタムマクロに組み込むことができるbuildmyprog.macroので、シェルから直接、またはemacsから実行できます。M-x compile $ xcc buildmyprog.macro このアプローチの主な問題は、xccコンパイルが始まるまでにプログラムのロードに10秒かかることです。私はすべての時間、私は私が実行し始めていることをコンパイルし、余分な10秒待っているの疲れ十分に得xccにansi-term別のバッファでは。コードを変更して保存した後、ansi-termバッファに切り替えて実行します …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.