C#启动进程并重定向标准输入输出后,读取标准输出失败
C# 与 Python 脚本通过进程重定向实现双向通信
如果你需要在C#程序中启动Python脚本,并通过标准输入输出实现进程间的双向交互,这里有一段实用的代码示例,核心是通过配置ProcessStartInfo来重定向Python解释器的流,实现数据的发送与接收:
using System; using System.Diagnostics; using System.Text; class PythonInterop { static void Main(string[] args) { string pyPath = @"C:\Anaconda3\python.exe"; string scriptPath = @"<替换为你的Python脚本路径>"; string workingDir = @"<替换为Python脚本所在目录>"; // 配置进程启动信息 ProcessStartInfo processStartInfo = new ProcessStartInfo(pyPath) { // 传递脚本路径作为命令行参数 Arguments = scriptPath, // 设置工作目录为脚本所在目录,避免路径相关问题 WorkingDirectory = workingDir, // 启用标准输入、输出、错误流的重定向 RedirectStandardInput = true, RedirectStandardOutput = true, RedirectStandardError = true, // 不创建独立控制台窗口 CreateNoWindow = true, // 必须设为false才能启用流重定向 UseShellExecute = false, // 设置编码避免中文乱码(与Python脚本编码保持一致) StandardOutputEncoding = Encoding.UTF8, StandardErrorEncoding = Encoding.UTF8 }; // 启动并管理Python进程 using (Process pythonProcess = Process.Start(processStartInfo)) { // 向Python脚本发送输入数据 pythonProcess.StandardInput.WriteLine("Hello from C#!"); pythonProcess.StandardInput.Flush(); pythonProcess.StandardInput.Close(); // 关闭输入流,告知Python无更多输入 // 读取Python脚本的输出和错误信息 string output = pythonProcess.StandardOutput.ReadToEnd(); string error = pythonProcess.StandardError.ReadToEnd(); // 等待进程执行完毕 pythonProcess.WaitForExit(); // 打印结果 Console.WriteLine("Python脚本输出内容:"); Console.WriteLine(output); if (!string.IsNullOrEmpty(error)) { Console.WriteLine("\nPython脚本错误信息:"); Console.WriteLine(error); } } } }
关键注意事项
- 重定向核心配置:必须将
UseShellExecute设为false,同时开启三个流的重定向选项,否则无法实现C#与Python的流交互。 - 编码一致性:如果脚本涉及非ASCII字符(比如中文),需确保C#端的编码设置与Python脚本一致(通常用UTF-8)。Python脚本开头可添加
# -*- coding: utf-8 -*-声明编码。 - 输入流处理:发送完输入后务必调用
Flush()和Close(),否则Python脚本会一直等待输入,导致进程挂起。 - 资源释放:使用
using语句包裹Process对象,确保进程资源在使用后被正确释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Wayne Vinson
相关产品推荐
相关产品推荐

