WPF C#通过CMD获取Python版本:执行命令未得到预期结果
获取Python版本:C#启动CMD进程的问题修复
你遇到的问题很典型——虽然成功启动了CMD窗口,但因为参数和进程配置的问题,没法正确捕获Python版本的输出结果。咱们一步步来修正:
原代码的核心问题
UseShellExecute = true:这个设置会让系统通过Shell启动进程,无法重定向标准输出;如果想获取命令执行结果,必须把它设为false。RedirectStandardOutput = false:没有开启输出捕获,自然拿不到python --version的返回内容。/k参数:这个参数会让CMD执行命令后保持窗口打开,而非执行完就退出;对于批量执行命令并获取结果的场景,应该用/c(执行命令后立即退出)。CreateNoWindow = false:如果不需要弹出CMD窗口,这个参数可以设为true,让进程在后台执行。
修正后的代码
using (System.Diagnostics.Process p = new System.Diagnostics.Process()) { // 关闭ShellExecute才能启用输出重定向 p.StartInfo.UseShellExecute = false; // 开启标准输出重定向,这样才能读取命令结果 p.StartInfo.RedirectStandardOutput = true; p.StartInfo.FileName = "cmd.exe"; // 使用/c参数执行命令后自动退出CMD,同时指定Python完整路径避免环境变量问题 p.StartInfo.Arguments = "/c C:/Python36/python.exe --version"; // 不显示CMD窗口(如果需要窗口可以改回false) p.StartInfo.CreateNoWindow = true; p.Start(); // 读取命令执行的全部输出,Trim去除多余换行和空格 string pythonVersion = p.StandardOutput.ReadToEnd().Trim(); // 等待进程完全执行完毕 p.WaitForExit(); // 这里处理获取到的版本信息,比如打印或者存储 Console.WriteLine("当前Python版本:" + pythonVersion); }
额外注意事项
- 如果你把Python添加到了系统环境变量里,也可以直接用
python --version代替完整路径,但指定完整路径能避免环境变量配置错误导致的问题。 - 一定要先调用
ReadToEnd()再调用WaitForExit(),否则可能出现进程死锁——因为进程会等待输出被读取完才会退出,而代码如果先等进程退出再读输出,就会互相卡住。
内容的提问来源于stack exchange,提问作者Thomaz Silveira
相关产品推荐
相关产品推荐

