7

私は最近、かなり奇妙なタスクに直面しており、1 つの結果として、非 X Linux コンピュータの端末を制御するために DTMF (別名「タッチ トーン」) トーンを使用する必要がありました。コンピューターには、ALSA を介してアクセスできるモデムがあり、したがって、私が入力を読み取っているのは sox "rec" プログラムです。それ以外の場合、問題のコンピューターは完全に分離されており、イーサネットやその他のネットワーク インターフェイスはまったくありません。私が使用している Goertzel アルゴリズムの実装は、出力の唯一のソースである eSpeak 音声合成エンジンと同様に、非常にうまく機能します。これは、すべての Touch Tone 電話で動作するはずです。入力 (入力は 8 進数で、一度に 1 ASCII バイト) とdashシェルはフィードバックします -- プロンプト、コマンドからの出力など、制御文字に ASCII ニーモニックを使用します。

私が対話するために使用している現在の方法とdash、それを介して起動されるプログラムはpexpectモジュールです。ただし、必要に応じて、カーソルが置かれている行の内容全体を読み戻すことができるようにする必要があり、これを実行できたことを思い出せませんpexpect(そうであれば、わかりません)。私が考えることができる他の唯一の解決策は、何らかの形で Python を使用して、キーボードとコンソールのドライバーを制御するか、またはそのように動作させることです。

これは、実際にそれを行う唯一の方法ですか (もしそうなら、Python でも可能ですか?)、またはコンソールの内容に直接アクセスする別の方法はありますか?

編集:運が悪かったので、最近、PExpect の SVN バージョンに pexpect.screen があることがわかりました。ただし、その下で実際にプログラムを実行する方法はありません。その展開を見守っていきたい。

4

2 に答える 2

3

簡単な解決策は、Linuxカーネルのuinputインターフェイスを使用することです。キー押下とマウスイベントを、物理的なヒューマンインターフェイスデバイスからのものであるかのように、カーネルに挿入できます。これは基本的にアプリケーションをキーボード/マウスに変えます。

Pythonを使用しているので、 python-uinputモジュールを確認することをお勧めします。

PythonでのバイナリI/Oに慣れている場合は、ライブラリがなくても同じことができます。/usr/include/linux/uinput.h関連する構造のヘッダーファイル(インターフェイスは完全に安定しています)と、おそらくCのいくつかのuinputチュートリアルも確認してください。

/dev/uinputまたは/dev/input/uinputデバイス(ディストリビューションによって異なります)にアクセスするには、通常、root権限が必要であることに注意してください。私は個人的にPythonサービスをサービス専用のユーザーおよびグループとして実行し、udevルールを変更/追加して(下のすべてのファイルをチェックrules.d)、そのグループへのuinputデバイスへの読み取り/書き込みアクセスを許可します。

SUBSYSTEM=="input", ENV{ID_INPUT}=="", IMPORT{builtin}="input_id"
KERNEL=="uinput", MODE="0660", GROUP="the-dedicated-group"

ただし、Pythonアプリケーションが単にプログラムを実行する場合は、ターミナルエミュレータにする必要があります。たとえば、これを使用しますPython ptyを使用して、追加のライブラリなしでそれを行うこともできます。ただし、主な作業は、ANSIエスケープシーケンスを使用して端末をシミュレートすることです。これにより、アプリケーションが混乱することはなく、既存の端末エミュレーターにはそのようなコードがあります。

于 2012-07-01T09:26:21.453 に答える
0

コンソールの内容を操作したい場合は、おそらくcurses. here で十分に文書化されています。と を見てwindow.getch()くださいwindow.getyx()

于 2011-04-30T00:06:20.107 に答える