端末を使用せずに新しいプロセスを開始しますが、出力用に新しい端末ウィンドウを開くのと同じですxfce4-terminal -e bash -c 'myCommand'
(入力も許可する必要があります)?新しい表示端末が完了するまで、元の端末(とにかく表示されない)を停止したいと思います。
上記のコマンドを呼び出すPython GUIがあるとしましょう。新しく開いたターミナルウィンドウでコマンドを実行するときに、Pythonスクリプトを停止して停止した後も続行したいと思います。
編集:私の状況に関する追加情報の要求に応じて、より具体的には次のようになります。
Python 3.xを使用してIDEを作成し、GUIにTkinterを使用しました。 GUIベースのプログラムなので、開いているターミナルウィンドウはありません(プログラムがあればとにかくバックグラウンドにあり、IDE全体がGUIです)。
私は選択したテキストの非対称暗号化のためにgpgコマンドラインツールを使用することを選択しました(この質問の範囲外の他のより重要な用途のPythonモジュールよりも便利で文書化されています。 .) 対称暗号化の場合、開いている端末ウィンドウが必要ないため問題はありませんが、非対称暗号化は重要でも重要でもない可能性がある追加の入力を要求する傾向があり、ユーザーはこれらのプロンプトに応答する必要があります。
暗号化したいテキストを一時ファイルに保存しますが、gpgはファイル全体を暗号化します(テキストがランダムに長くなる可能性があるため、ファイルとして保存せずに端末に出力すると問題が発生する可能性があります)。
したがって、ユーザーがテキストを選択してメソッドを実行すると、gpgプロンプトでターミナルウィンドウがポップアップしたいと思います。理想的には、ユーザーが「はい」または「いいえ」と言ってEnterキーを押すと、選択したテキストが非対称に暗号化されたテキストに置き換えられます。しかし、実際に起こるのは、端末ウィンドウがポップアップされ、プログラムが実際に暗号化する前に暗号化されたテキストを取得しようとすることです(ユーザーが何も入力するのを待たないため)。私はユーザーが「はい」または「いいえ」と言った後に暗号化する時間であることをIDEに手動で知らせたくありません。
パイプを使用して、GUIベースのユーザー入力を隠し端末にルーティングできると考えることもできます。しかし、動作しないなど奇妙な理由のため。y | gpg -a --encrypt --recipient [email protected] tempFile.txt
ベストアンサー1
新しい端末エミュレータを実行すると、新しい端末が作成されます(Linuxの場合)。出力するためにその端末でプログラムを起動する必要はありません(ターミナルで実行してから別の端末で実行してみてください)。したがって、Pythonスクリプトに端末で読み書きするように指示できます。必要なのは、デバイスファイルのパスを探すだけです。/dev/pts/NUMBER
tty
echo hello >/dev/pts/NUMBER
xtermを使用すると非常に簡単です。xterm -e 'tty >&3; myCommand'
パイプに接続されたファイル記述子3を使用して実行すると、プログラムは端末装置へのパスを読み取ります。
p = subprocess.Popen("xterm -e 'tty >&3; exec sleep 99999999' 3>&1",
shell=True, stdout=subprocess.PIPE)
tty_path = readline(p.stdout)
tty = open(tty_path, 'r+')
これでPythonプログラムが読み書きできますtty
。完了したら、ターミナルエミュレータ(os.kill(p.pid, signal.SIGTERM)
)を閉じます。
複数のウィンドウを持つ単一のプロセスに基づいているターミナルエミュレータ(xfce4-terminalなど)を使用すると、目的の操作がはるかに困難になります。実行すると、xfce4-terminal
端末エミュレータの親プロセスと子プロセスとの間のリンクが切断され、終了するのに良いPIDが提供されません。名前付きパイプを使用して通信できますが、設定が難しいボットです。