os.system() 呼び出しによって起動されたコマンドの出力をキャプチャおよび/または削除しようとしています。スクリプトは、Linux および Windows で実行されます。
上記のコマンドはインタラクティブであるため、サブプロセスモジュールを使用できません(つまり、ユーザーはさまざまなアクションをトリガーするための指示を入力できます)。そのため、このスレッドを、たとえば次のような一般的な質問の重複として言及しないでください。
- Python: os.system の実行後に stdout を取得する方法は?
- Pythonで標準出力に出力したos.systemの戻り値を保存するには?
- os.system の出力を変数に割り当て、画面に表示されないようにする
- ...
1 つの解決策は、そのような「ラップされた」プログラムでサブプロセスを機能させることです。私のスクリプトの主な機能。次のスレッドは有望に見えましたが、粗雑な os.system() ほどうまく機能しません (単純でもありません...):
- Python 内から対話型コマンドを実行する
- Pythonのsubprocess.PIPEでのノンブロッキング読み取り
- 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 制御は本当です)