0

os.system() 呼び出しによって起動されたコマンドの出力をキャプチャおよび/または削除しようとしています。スクリプトは、Linux および Windows で実行されます。

上記のコマンドはインタラクティブであるため、サブプロセスモジュールを使用できません(つまり、ユーザーはさまざまなアクションをトリガーするための指示を入力できます)。そのため、このスレッドを、たとえば次のような一般的な質問の重複として言及しないでください。

  1. Python: os.system の実行後に stdout を取得する方法は?
  2. Pythonで標準出力に出力したos.systemの戻り値を保存するには?
  3. os.system の出力を変数に割り当て、画面に表示されないようにする
  4. ...

1 つの解決策は、そのような「ラップされた」プログラムでサブプロセスを機能させることです。私のスクリプトの主な機能。次のスレッドは有望に見えましたが、粗雑な os.system() ほどうまく機能しません (単純でもありません...):

  1. Python 内から対話型コマンドを実行する
  2. Pythonのsubprocess.PIPEでのノンブロッキング読み取り
  3. http://log.ooz.ie/2013/02/interactive-subprocess-communication-in.html

もう 1 つの解決策は、Linux ディストリビューションでネイティブにサポートされているような「ティー」関数を作成することです。たとえば、ここで適切な実装を見つけました(ファイルと元のsys.stdoutの両方に書き込むようにsys.stdoutを変更するTeeクラス):

問題は、os.system() がメイン スクリプトの stdout に出力されないように見えることです。代わりに、サブシェルでプログラムを起動し、その出力を取得/抑制する方法が見つかりません...

他のアプローチまたは解決策がある場合は、お知らせください。ありがとう。


コンテキストに関するいくつかの詳細が尋ねられ、以下のコメントに記載されています。主な質問は、サブプロセスが明らかな解決策であると思われるときに、なぜ私が os.system() に固執するのかに関係しています。

私が実行するプログラムは CAST3M ( http://www-cast3m.cea.fr/ ) と呼ばれます。これは、物理学のさまざまな分野の問題を解決するために使用される有限要素コードです。GUI がないため、ユーザーは GIBIANE と呼ばれるコマンドライン カスタム言語を介して対話します。古典的には、事前に作成された GIBIANE データ ファイルを CAST3M にフィードするか、データ ファイルなしでプログラムを起動してオンザフライでコマンドを入力することができます。以下は、典型的な GIBIANE 命令です (いくつかの点を定義し、次に線、正方形、最後にそれらの上にある立方体を定義します):

OPTI 'DONN' 3 'ELEM' 'CUB8' ;
PT1 = 0. 0. 0. ;
PT2 = 1. 0. 0. ;
PT3 = 0. 1. 0. ;
PT4 = 0. 0. 1. ;
NN1 = 5 ;
DR1 = PT1 DROI NN1 PT2 ;
SF1 = DR1 TRAN NN1 PT3 ;
VL1 = SF1 VOLU 'TRAN' NN1 PT4 ;

実際に起動する前に、CAST3M のいくつかの機能を微調整することを意図した Python でラッパーを作成しました。この Python スクリプトによって出力される内容と、CAST3M セッションの出力をログに記録する必要があります。対話性がない場合、サブプロセスが仕事をします。サブプロセスが CAST3M とうまく動作しないため、双方向性がある場合は os.system() を使用せざるを得ません (os.system() がすぐに使用できる CAST3M に引き渡す必要があるだけです)。の IO 制御は本当です)

4

2 に答える 2

1

=> Martijn Pieters が言うように、os.system() 呼び出しの stdout を取得する方法はありません (サブシェル = ブラック ボックスが生成されるため、その戻りコードしかわかりません)。解決策は、Python を最終ユーザーと CAST3M の間のプロキシとして機能させることです (パススルー構成: Python は「仲介者」であり、ユーザーの要求をリッスンし、それを「そのまま」CAST3M に送信し、CAST3M の応答をキャプチャし、ユーザーに出力します)。これには、サブプロセス、スレッド、およびキュー モジュールを使用する必要があります。それがもたらす複雑さ (および元の HCI エクスペリエンスの変更) を気にしない場合は、役に立つリンクの簡単な要約を以下に示します。

  1. サブプロセスの stdout/stderr をラップする
  2. いつものようにpythonサブプロセス出力stdoutとstderrを作成できますが、出力を文字列としてキャプチャすることもできますか?
  3. Python 内から対話型コマンドを実行する
  4. Pythonのsubprocess.PIPEでのノンブロッキング読み取り
  5. http://log.ooz.ie/2013/02/interactive-subprocess-communication-in.html

=> Robᵩ は、「スクリプト」Linux ツールにロギング タスクを指定することにより、Linux のみの回避策を提供します。これにより、「user<>CAST3M」の対話性をそのまま維持できます (ここにはプロキシはありません)。

于 2013-10-30T09:29:10.030 に答える
0

Linux では、scriptはすべてのユーザー インタラクションをキャプチャしながらインタラクティブな環境を提供します。

os.system("script -c '/bin/ed /etc/passwd' /tmp/capture_file")

上記の関数呼び出しはed、パスワード ファイルのライン エディターを呼び出します。すべてのユーザー インタラクションは に保存され/tmp/capture_fileます。

于 2013-10-29T15:44:26.393 に答える