この種の質問はこれまでにもさまざまな程度で尋ねられてきましたが、簡潔な回答が得られていないと感じたので、再度質問します。
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
場所を として渡しcmd
、filename
場所を として渡すと、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 実行可能ファイルへの完全なパスを指定しFileName
、Arguments
スクリプトと読み取りたいファイルの両方を指定する文字列を構築する必要があります。
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);
}
}
}