小能豆

如何从 C# 运行 Python 脚本?

javascript

这类问题以前曾不同程度地被问过,但我觉得没有得到简洁的回答,所以我再次提出这个问题。

我想运行一个 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 或其他任何东西。无论你有什么 hack 都可以。

PS:我运行的实际 Python 代码比这复杂得多,它返回我在 C# 中需要的输出,并且 C# 代码将不断调用 Python 代码。

假装这是我的代码:

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

阅读 40

收藏
2024-06-29

共1个答案

小能豆

它不起作用的原因是因为你有UseShellExecute = false

如果您不使用 shell,您将必须提供 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);
         }
     }
}
2024-06-29