Oracle exp/imp コマンドを使用し、sqlplus を介して SQL スクリプトを開始するための GUI を作成しています。サブプロセス クラスを使用すると、コマンドを簡単に起動できますが、追加の機能が必要です。wxPython GUI を使用するときにコマンド プロンプトを削除したいのですが、exp/imp コマンドの出力を表示する方法が必要です。
私はすでにこれらの2つの方法を試しました:
command = "exp userid=user/pwd@nsn file=dump.dmp"
process = subprocess.Popen(command, stdout=subprocess.PIPE)
output = process.communicate()[0]
process = subprocess.Popen(command, stdout=subprocess.PIPE)
process.wait()
output = process.stdout.read()
これらの方法の 1 つ (どの方法を忘れたか) を使用して、exp/imp の出力を実際に取得しましたが、コマンドが終了した後でのみ、これらの実行時間が長くなる可能性のある操作中に頻繁に更新する必要があるため、これはまったく価値がありません。また、sqlplus は、エラーが発生したときに何らかの入力を必要とするため、さらに多くの問題を引き起こしました。これが発生すると、python はプロセスが終了するのを待ちますが、ユーザーにはプロンプトが表示されないため、待機時間や何をすべきかわかりません...
私が欲しいのは、標準のコマンドラインで表示できるすべてのものを出力するラッパーです。これをファイルに記録し、wxPython コントロール内に表示したいと考えています。
このページのコードも試しました: http://code.activestate.com/recipes/440554/ しかし、これも出力を読み取ることができません。この回答の OutputWrapper も機能しません: wxPython アプリケーションからすべての例外をキャプチャするにはどうすればよいですか?
どんな助けでも大歓迎です!
編集:
サブプロセスは出力をフラッシュしていないようです。私はすでに .readline() で試しました。
私のツールは Windows と UNIX で実行する必要があるため、Windows バージョンがない場合、pexpect は解決策になりません。また、exp、imp、および sqlplus の機能全体を再構築する必要があるため、cx_oracle を使用するのは非常にやり過ぎです。