这类问题以前曾不同程度地被问过,但我觉得没有得到简洁的回答,所以我再次提出这个问题。
我想运行一个 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。
code.py
cmd
filename
args
python.exe
code.py filename
我已经找了一段时间了,只找到建议使用 IronPython 之类的东西的人。但一定有一种方法可以从 C# 调用 Python 脚本。
一些澄清:
我需要从 C# 运行它,我需要捕获输出,我不能使用 IronPython 或其他任何东西。无论你有什么 hack 都可以。
PS:我运行的实际 Python 代码比这复杂得多,它返回我在 C# 中需要的输出,并且 C# 代码将不断调用 Python 代码。
假装这是我的代码:
private void get_vals() { for (int i = 0; i < 100; i++) { run_cmd("code.py", i); } }
它不起作用的原因是因为你有UseShellExecute = false。
UseShellExecute = false
如果您不使用 shell,您将必须提供 python 可执行文件的完整路径FileName,并构建Arguments字符串以提供您的脚本和您想要读取的文件。
FileName
Arguments
RedirectStandardOutput另请注意,除非,否则您不能UseShellExecute = false。
RedirectStandardOutput
我不太确定 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); } } }