从C#控制台应用调用Python CLI脚本无输出问题求助
解决C#调用Python脚本无输出的问题
问题分析
你的代码存在几个关键问题导致无输出:
路径错误:
@"\python.exe"和"\pythonScript.py"使用了根目录路径(开头的反斜杠),除非Python解释器和脚本确实在系统根目录,否则会找不到文件,直接导致进程无法正常启动或执行脚本。缺少必要参数:
Python脚本通过argparse定义了两个必填位置参数FirstName和LastName,但C#调用时只传入了脚本路径,未提供这两个参数,导致Python脚本执行时抛出参数错误,输出内容会被写入标准错误流而非标准输出流。未捕获错误输出:
你读取了标准错误流但未打印,即使Python脚本报错也看不到问题原因;同时同步读取标准错误和输出的顺序可能导致死锁(进程等待输出被读取,而代码卡在读取其中一个流的步骤)。
修复后的代码
Python脚本(无需修改)
import argparse parser = argparse.ArgumentParser() parser.add_argument('FirstName') parser.add_argument('LastName') args = parser.parse_args() first_name = args.FirstName last_name = args.LastName print(f"{first_name} {last_name}")
修复后的C#代码
using System; using System.Diagnostics; using System.IO; using System.Threading.Tasks; namespace CS_PythonTest { internal class Program { static async Task Main(string[] args) { var psi = new ProcessStartInfo(); // 修正Python路径:若已加入系统PATH直接写"python.exe",否则写完整绝对路径 psi.FileName = "python.exe"; // 修正脚本路径:获取当前程序所在目录的脚本路径 var scriptPath = Path.Combine(Environment.CurrentDirectory, "pythonScript.py"); // 添加Python脚本需要的两个参数 psi.Arguments = $"{scriptPath} Alice Smith"; psi.UseShellExecute = false; psi.CreateNoWindow = true; psi.RedirectStandardOutput = true; psi.RedirectStandardError = true; var errors = ""; var results = ""; using (var process = Process.Start(psi)) { // 异步读取输出和错误,避免死锁 var errorTask = process.StandardError.ReadToEndAsync(); var outputTask = process.StandardOutput.ReadToEndAsync(); // 等待进程执行完成 process.WaitForExit(); // 获取读取结果 errors = await errorTask; results = await outputTask; } // 打印输出和错误信息 Console.WriteLine("脚本输出:"); Console.WriteLine(results); if (!string.IsNullOrEmpty(errors)) { Console.WriteLine("\n错误信息:"); Console.WriteLine(errors); } } } }
额外注意事项
- 确保Python解释器路径正确:如果系统PATH中未配置Python,需指定完整路径,比如
@"C:\Program Files\Python311\python.exe"。 - 确保Python脚本与C#编译后的程序在同一目录,或使用正确的相对/绝对路径指向脚本。
- 若需动态传入参数,可将
"Alice Smith"替换为实际变量,比如$"{scriptPath} {firstName} {lastName}"。
内容的提问来源于stack exchange,提问作者user12312852
相关产品推荐
相关产品推荐

