現在、私のC++プログラムからpythonで書かれたファイルをpstreamライブラリ(http://pstreams.sourceforge.net/)で起動しようとしています。私のコードは次のようになります。C++のpythonプログラムからstderrを取得する
QStringList res;
QStringList resErrors;
// run a process and create a streambuf that reads its stdout and stderr
redi::pstream proc(cmd, redi::pstreams::pstdout | redi::pstreams::pstderr);
std::string line;
// read child's stdout
while (std::getline(proc.out(), line))
res.append(QString::fromStdString(line));
// read child's stderr
while (std::getline(proc.err(), line))
resErrors.append(QString::fromStdString(line));
通常、正しく生成され、エラーメッセージはpstreamコンストラクタに入力されたコマンドから出力されます。しかし、トレースバックを発生させるpythonファイルを実行しようとすると、(stdoutまたはstderrに)出力がありません。例えば
、このPythonのファイル:
#!/usr/bin/env python
test = 5/0
print "test"
意志stdoutとstderrで何でノープリント "テスト"。私は、端末でそれを実行した場合でも、私が正しくなった:私は、同じコマンドを使用し、両方の場合
Traceback (most recent call last):
File "test.py", line 3, in <module>
test = 5/0
ZeroDivisionError: integer division or modulo by zero
:「Pythonのtest.py」
私はそのを印刷するのpythonに指示する必要があります推測しますstderrへのトレースバック?しかし、なぜそれがサブプロセスで行われていないのですか?あるいは、それは図書館のバグでしょうか?
私が念頭に置いている別の可能性は、stdoutとstderrをあまりにも早く読み込み、Pythonに書き込む時間がなかったことです。しかし、私はそれを読む前にスリープ機能を追加しようとしましたが、何の効果もありません。
stdoutを読み取ると、stderrによってデッドロックが発生する可能性があります。別々のスレッドでそれらを読まなければなりません/それらを読むために非ブロッキングな方法を見つけなければなりません。 –
さて、私はそれを試してみましょう。しかし、実際には、2つの「条件」が無効になるため、デッドロックは発生しません。この場合、出力がまったくないようなものです – Kryx