4

端末を生成する GUI のサブプロセスを生成しようとしています。この端末で生成されたデータ (stdout と stderr) を、表示されるウィンドウと設定されたログ ファイルに表示したい。コマンドをシェルに直接入力すると、意図したとおりに機能しますが、開始コマンドとして QProcess に提供されると、実際にはファイルに何も書き込まれません。

例: ユーザーがバイナリをインストールしていない場合、コマンドが見つからなかったことを bin.log に書き込む必要があります。生成された QProcess の環境を実行中の親プロセスと同じになるように設定し (bash などを見つけることができるように)、QProcess.start() メソッドを呼び出す前に作業ディレクトリを設定しました。次のテストケースを作成しました。

gnome-terminal --title 'Sub-Terminal' -e 'bash -c "foo [args to foo] |& tee foo.log"'

Qtでは、次のことを行います。

QProcess *child = new QProcess(this);
QString   cmd   = "gnome-terminal --title 'Sub-Terminal' -e 'bash -c \"foo [args to foo] |& tee foo.log\"'";
child->setProcessEnvironment(<process environment I have created before>);
child->setWorkingDirectory(<current working dir>);
child->start(cmd);
...

端末を生成しますが、foo.log にはデータを書き込みません。私も次のことを試しました:

QProcess *child = new QProcess(this);
QString   prog  = "gnome-terminal"
QStringList args;
args << "-x" << "bash" << "foo" << "[foo's arguments]" << "|&" << "tee" << "foo.log";
// set the process env and working dir
child->start(prog, args);

これを解決する方法について誰かアドバイスはありますか?QProcess.setStandardErrorFile(foo.log) と QProcess.setStandardOutputFile(foo.log) を使用して stdout と stderr をリダイレクトしようとしましたが、gnome 端末自体から stdout をリダイレクトしているようです (これは何もありません)。

4

1 に答える 1

2

ターミナルで実行するコマンド全体を単一の引数としてQProcessafter"-e"に指定する必要があります。また、bash で実行するコマンドを単一の引数として bash に指定する必要があります。

args << "-e" << "bash -c 'foo [args to foo] |& tee foo.log'";

これは基本的に実行されます

bash -c 'foo [args to foo] |& tee foo.log'

ターミナルで、それ自体が実行されます

foo [args to foo] |& tee foo.log

バッシュ内。

gnome-terminalプロセスからの出力の読み取りが機能しないというあなたの推測は正しいです。

于 2012-12-07T19:57:49.817 に答える