0

Python スクリプトを実行する WCF サービスを作成しています。

そのために、次のコードを使用しています。

ProcessStartInfo start = new ProccessStartInfo();
start.FileName = "my/full/path/to/python.exe";
start.Arguments = string.Format("{0} {1}", script, args);
start.UseShellExecute = false;
start.CreateNoWindow = true;
start.RedirectStandardOutput = true;
start.RedirectStandardError = true;

Process p = new Process();
p.StartInfo = start;
p.Start();
p.WaitForExit();
string stderr = Process.StandardError.ReadToEnd();
string stdout = Process.StandardOutput.ReadToEnd();

今私が気付いたのは(多くのテストの後)、宣言されていない変数が使用されている場合など、エラーが「コンパイル」エラーに関連している場合、プロセスオブジェクトが標準エラー/出力を取得するか、例外をキャッチすることですただし、ランタイム例外と出力はキャッチされていないか、C# スコープで読み取ることができません。

C#コードから送信された「python.exe pythonCommand.py args」全体を実行するか、コマンドラインプロンプトのProcessStartInfo.Argumentsにあったものを送信しようとしましたが、どちらの場合も例外と出力が返されました、しかし、それでもC#Processオブジェクトを介して実行すると、キャッチするために例外がスローされたり、出力やエラーが発生したりしません。

私はこれについて私がちょっとばかげていると感じさせるものは何も見つけていません(うまくいけば私はそうであり、これには簡単な解決策があります)。

ありがとう、マット

4

1 に答える 1

0

さて、ここであなたのコメントに答えるために:

しかし、問題は、Pythonから例外がスローされないことと、出力が読み取られることの両方です。プロセスの標準出力 (および標準エラーも) は常に空です – Matt Star

出力を間違ってキャプチャしています。これにより、出力をキャプチャできるようになり、スローされた例外が表示されます。

システムを使用する; System.Diagnostics を使用します。

namespace InteractWithConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            ProcessStartInfo cmdStartInfo = new ProcessStartInfo();
            cmdStartInfo.FileName = @"C:\Windows\System32\cmd.exe";
            cmdStartInfo.RedirectStandardOutput = true;
            cmdStartInfo.RedirectStandardError = true;
            cmdStartInfo.RedirectStandardInput = true;
            cmdStartInfo.UseShellExecute = false;
            cmdStartInfo.CreateNoWindow = true;

            Process cmdProcess = new Process();
            cmdProcess.StartInfo = cmdStartInfo;
            cmdProcess.ErrorDataReceived += cmd_Error;
            cmdProcess.OutputDataReceived += cmd_DataReceived;
            cmdProcess.EnableRaisingEvents = true;
            cmdProcess.Start();
            cmdProcess.BeginOutputReadLine();
            cmdProcess.BeginErrorReadLine();

            cmdProcess.StandardInput.WriteLine("ping www.bing.com");     //Execute ping bing.com
            cmdProcess.StandardInput.WriteLine("exit");                  //Execute exit.

            cmdProcess.WaitForExit();
        }

        static void cmd_DataReceived(object sender, DataReceivedEventArgs e)
        {
            Console.WriteLine("Output from other process");
            Console.WriteLine(e.Data);
        }

        static void cmd_Error(object sender, DataReceivedEventArgs e)
        {
            Console.WriteLine("Error from other process");
            Console.WriteLine(e.Data);
        }
    }
}

この投稿からコードをコピーしました: How to parse command line output from c#? 私はこの方法を何度も使用しており、完璧に機能します。お役に立てれば。

于 2013-07-17T20:22:31.260 に答える