You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中实时捕获Python控制台输出

在C#中创建Python进程并捕获控制台输出

我帮你把这段代码完善并优化,确保能正确捕获Python脚本的控制台输出。下面是完整的实现方案,包含关键配置说明、同步读取和异步读取两种方式:

完整同步读取实现

这种方式适合执行时间较短的Python脚本,代码逻辑简单直接:

using System;
using System.Diagnostics;

namespace ConsoleApp1
{
    public class CreateProcess
    {
        public string PythonPath { get; set; }
        public string FilePath { get; set; }
        public string Arguments { get; set; }
        private Process _process;

        public string RunAndCaptureOutput()
        {
            _process = new Process();
            var startInfo = new ProcessStartInfo
            {
                FileName = PythonPath,
                // 拼接脚本路径与额外参数,路径含空格时要加双引号避免解析错误
                Arguments = $"\"{FilePath}\" {Arguments}",
                // 核心配置:必须关闭ShellExecute才能启用输出重定向
                UseShellExecute = false,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                // 不显示Python的独立控制台窗口
                CreateNoWindow = true,
                // 设置UTF-8编码,避免中文输出乱码
                StandardOutputEncoding = System.Text.Encoding.UTF8,
                StandardErrorEncoding = System.Text.Encoding.UTF8
            };

            _process.StartInfo = startInfo;
            _process.Start();

            // 读取标准输出和错误输出内容
            string output = _process.StandardOutput.ReadToEnd();
            string error = _process.StandardError.ReadToEnd();

            // 等待进程执行完成
            _process.WaitForExit();

            // 合并错误输出(如果有)
            if (!string.IsNullOrEmpty(error))
            {
                output += $"\n--- Error Output ---\n{error}";
            }

            // 追加进程退出码,方便排查执行状态
            output += $"\nProcess exited with code: {_process.ExitCode}";

            return output;
        }
    }
}

使用示例

在主程序中调用这个类的示例代码:

class Program
{
    static void Main(string[] args)
    {
        var pythonRunner = new CreateProcess
        {
            PythonPath = @"C:\Python39\python.exe", // 替换为你的Python实际安装路径
            FilePath = @"C:\MyScripts\test.py",     // 替换为你的Python脚本路径
            Arguments = "--name John --age 30"      // 脚本的额外参数(可选)
        };

        string scriptOutput = pythonRunner.RunAndCaptureOutput();
        Console.WriteLine("Python脚本执行结果:");
        Console.WriteLine(scriptOutput);
    }
}

异步读取版本(适合长耗时脚本)

如果你的Python脚本执行时间较长,同步读取可能会阻塞主线程,推荐使用异步事件监听的方式:

using System;
using System.Diagnostics;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    public class CreateProcess
    {
        public string PythonPath { get; set; }
        public string FilePath { get; set; }
        public string Arguments { get; set; }
        private Process _process;

        public async Task<string> RunAndCaptureOutputAsync()
        {
            _process = new Process();
            var startInfo = new ProcessStartInfo
            {
                FileName = PythonPath,
                Arguments = $"\"{FilePath}\" {Arguments}",
                UseShellExecute = false,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                CreateNoWindow = true,
                StandardOutputEncoding = Encoding.UTF8,
                StandardErrorEncoding = Encoding.UTF8
            };

            _process.StartInfo = startInfo;

            var outputBuilder = new StringBuilder();
            var errorBuilder = new StringBuilder();

            // 注册输出和错误的异步监听事件
            _process.OutputDataReceived += (sender, e) =>
            {
                if (!string.IsNullOrEmpty(e.Data))
                {
                    outputBuilder.AppendLine(e.Data);
                }
            };

            _process.ErrorDataReceived += (sender, e) =>
            {
                if (!string.IsNullOrEmpty(e.Data))
                {
                    errorBuilder.AppendLine(e.Data);
                }
            };

            _process.Start();

            // 启动异步读取
            _process.BeginOutputReadLine();
            _process.BeginErrorReadLine();

            // 异步等待进程结束
            await _process.WaitForExitAsync();

            string output = outputBuilder.ToString();
            string error = errorBuilder.ToString();

            if (!string.IsNullOrEmpty(error))
            {
                output += $"\n--- Error Output ---\n{error}";
            }

            output += $"\nProcess exited with code: {_process.ExitCode}";

            return output;
        }
    }
}

关键注意点

  • 路径含空格处理:如果Python路径或脚本路径包含空格,一定要用双引号包裹,避免系统解析路径出错
  • 编码设置:必须指定UTF-8编码,否则Python输出的中文内容会出现乱码
  • 退出码判断:Python脚本正常执行时退出码为0,如果非0说明脚本执行出错,结合错误输出可以快速定位问题
  • ShellExecute设置:UseShellExecute必须设为false,否则无法重定向标准输出和错误输出

内容的提问来源于stack exchange,提问作者Barkz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:29:45