間違ったコードを実行しているコンソールアプリケーション

私はこの問題によって絶対に困惑しています。私が作っているプログラムをすばやく動かす:

私は不規則な量のPythonスクリプトを取得し、スクリプトを実行し、StdOut/Errを解析し、それらの結果をデータベースに書き込むハーネスを構築しています。

私は底からそれを構築してきました、そして今、私はすべての作品を一緒にまとめる必要があります。しかし、私は問題をデバッグしてきました。私は通常コンソールアプリケーションを作っていませんが、私がやっていることの目的のために、私の目的はPythonスクリプトを引数として取るコンソールアプリケーションを作ることです。

そこで、私の名前空間の中には、わかりやすくするために2つの異なるファイルに分けた2つの主要なクラスがあります。内のすべての機能は静的なので、実際には組織的なものです。 2つのファイルは、私が書いた出力キャプチャアプリケーションを実行しているpythonと、私が書いたデータベースのレポート作成アプリケーションに対応する "Harness"と "Query"です。今、私はHarnessの結果をQueryに入れようとしています。私の同僚がコードを管理しやすくするために、私はそれらを別々のファイルに保管して消化しやすいようにしています。

問題は、私がコマンドラインを起動して実行可能ファイルをナビゲートし、引数としてサンプルpythonスクリプトを渡して実行すると、アプリケーションのクエリの半分だけからコンソール出力が得られるということです。私はいくつかのConsole.WriteLinesをハーネスファイル内のmain(string [] args)関数に入れましたが、これらは決して書き込まれません。 2番目のQueryクラス内のコードだけが実行されます - sort of。

ここでは、物事が実際に私を混乱させ始めるところです。アプリの半分のハーネス内の機能の1つがログファイルに書き込んで、実行時間を記録し、結果を報告する必要があります。このテキストファイルはまだ書き込まれています。私はその後、私のリダイレクトstdが明らかに動作していなかったので、私のサンプルpyファイルの出力をテキストファイルにすることを考えました。確かに、Pythonはそのテキストファイルを開いてそれに書き込んで、実際にそのコードを実行したことを私に示唆しています。

しかし、これらのロギングコールが含まれる関数には、コンソールに出力されないConsole.WriteLinesが含まれています。コンソール出力が動作している唯一の時間は、アプリケーションの後半です。

誰かがこれらの問題について少しの光を放つことができたら、私はそれを本当に掘り下げます。私が持っている多くのコードには機密データが含まれているので、大きなダンプを与えるだけではなく、問題に関連しているコードの特定の領域は実際にはありません。確かに。私があなたから必要なものを私に教えてください。そして私はベストを尽くします。

        List retList = new List();
       //Loads Python
        Process pr = new Process();

        pr.StartInfo.FileName = @"C:\Python27\python.exe";
        pr.StartInfo.Arguments = script;
        Console.WriteLine(script);
        //pr.StartInfo.Arguments = @"C:\PythonProj\hello.py";
        pr.StartInfo.UseShellExecute = false;
        pr.StartInfo.RedirectStandardOutput = true;
        pr.StartInfo.RedirectStandardError = true;

       //Runs Test Script
        pr.Start();
        string output = pr.StandardError.ReadToEnd();
        pr.WaitForExit();
        Console.WriteLine(output);
1
関連するコードを表示してください。
追加された 著者 Austin Salonen,
オースティンとの合意。具体的には、新しいプロセスを作成/呼び出すコードを表示します。プロパティは、入出力ストリームのリダイレクトを処理するために適切に設定されていない可能性があります。
追加された 著者 Servy,
メインのポストにコードを編集しました。そして、それが価値あるものであれば、コードを走らせたハーネスはそれ自身で働く(ed)。実際にリダイレクトされたコードを見ている間は、「ハーネス」クラスのコンソール記述文はコンソールに出力されません
追加された 著者 Wuzseen,

1 答え

最初の問題は、私が予想したように、デッドロックの可能性があるということです。私はあなたが標準出力から何を読み込んでいるのか分からず、出力とエラーの両方をリダイレクトしているので、デッドロックしないように読み方を注意する必要があります。プロセスのリダイレクトプロパティのMSDNページでは、この問題について説明し、目的に合ったコード例を用意しています。

問題があなたのコンソールでプロセスの出力を見ていないということであれば、これまでのところどこに書かれているのか分かりません。簡潔にするために省略しましたか?もしそうなら、それを含めてください。

1
追加された
あなたは標準のエラーではなく標準のエラーを読み書きしています。デッドロックは確実なことではなく、ストリームに書き込まれるデータの量と、バッファをいっぱいにすることができるかどうかに依存します。これらのデッドロックの詳細については、MSDNを参照してください。
追加された 著者 Servy,
まあ、私が前に言ったように、あなたのコードのsnippitには "pr.StandardOutput.Read .."の呼び出しはありません。 StandardErrorの結果 'output'を呼び出すという事実に基づいて、上のコードスニッフィットで標準出力を得ていると思います。あなたは違う。その電話を省略した場合は、それを含めてください。あなたがそれを含んでいなければ、そこにあなたの問題があります。
追加された 著者 Servy,
あなたの問題を整理することができてうれしいです。
追加された 著者 Servy,
ストリームを文字列var:出力にリダイレクトします。下から3行目、デバッグのために2行後にコンソールに書き出します。また、このコードでは、スクリプトを単独で実行しています。私は後半に追加するときだけ、この問題が発生します。
追加された 著者 Wuzseen,
そうですね、私は、 "Query"コードのない別のプロジェクトでこのコードを繰り返し実行しているので、私が探しているものは完全にはわかりません。それは、何度も何度も働いています。この文書を何度も見てきたので、私が探しているものを正確に知らせることができれば。
追加された 著者 Wuzseen,
私がテストしていたPythonスクリプトの議論が欠落していたことが分かりました。すべてがスムーズなセーリングに戻っています。愚かな、愚かな、私。これを実現するには数時間かかりました:3助けてくれてありがとう。
追加された 著者 Wuzseen,