C# から Python スクリプトを実行するにはどうすればいいですか? 質問する

C# から Python スクリプトを実行するにはどうすればいいですか? 質問する

この種の質問はこれまでにもさまざまな程度で尋ねられてきましたが、簡潔な回答が得られていないと感じたので、再度質問します。

Python でスクリプトを実行したいです。次のようなスクリプトがあるとします。

if __name__ == '__main__':
    with open(sys.argv[1], 'r') as f:
        s = f.read()
    print s

ファイルの場所を取得し、それを読み取り、その内容を出力します。それほど複雑ではありません。

さて、これを C# で実行するにはどうすればよいでしょうか?

これが今私が持っているものです:

    private void run_cmd(string cmd, string args)
    {
        ProcessStartInfo start = new ProcessStartInfo();
        start.FileName = cmd;
        start.Arguments = args;
        start.UseShellExecute = false;
        start.RedirectStandardOutput = true;
        using (Process process = Process.Start(start))
        {
            using (StreamReader reader = process.StandardOutput)
            {
                string result = reader.ReadToEnd();
                Console.Write(result);
            }
        }
    }

code.py場所を として渡しcmdfilename場所を として渡すと、args機能しません。python.exeを として渡しcmd、次にcode.py filenameを として渡す必要があると言われましたargs

しばらく探していましたが、IronPython などを使用することを提案している人しか見つかりませんでした。しかし、C# から Python スクリプトを呼び出す方法が必ずあるはずです。

説明:

C# から実行し、出力をキャプチャする必要がありますが、IronPython などは使用できません。どのようなハックでも問題ありません。

PS: 私が実際に実行している Python コードはこれよりもはるかに複雑で、C# で必要な出力を返し、C# コードは Python コードを常に呼び出します。

これが私のコードだと仮定します:

    private void get_vals()
    {
        for (int i = 0; i < 100; i++)
        {
            run_cmd("code.py", i);
        }
    }

ベストアンサー1

動作しない理由は、 があるためですUseShellExecute = false

シェルを使用しない場合は、 として Python 実行可能ファイルへの完全なパスを指定しFileNameArgumentsスクリプトと読み取りたいファイルの両方を指定する文字列を構築する必要があります。

RedirectStandardOutputまた、 でない限り、はできないことに注意してくださいUseShellExecute = false

Python の引数文字列をどのようにフォーマットすればよいかはよくわかりませんが、次のようなものが必要になります。

private void run_cmd(string cmd, string args)
{
     ProcessStartInfo start = new ProcessStartInfo();
     start.FileName = "my/full/path/to/python.exe";
     start.Arguments = string.Format("{0} {1}", cmd, args);
     start.UseShellExecute = false;
     start.RedirectStandardOutput = true;
     using(Process process = Process.Start(start))
     {
         using(StreamReader reader = process.StandardOutput)
         {
             string result = reader.ReadToEnd();
             Console.Write(result);
         }
     }
}

おすすめ記事