如何通过Python正确运行带参数的C# .NET Core 3.1控制台应用?故障原因及解决方法
为什么Python调用C# .NET Core控制台程序没反应?怎么正确带参数运行?
首先,咱们先拆解下你当前代码的问题根源:
问题出在哪?
- 异步执行+无输出捕获:
subprocess.Popen是异步启动进程的,它不会等你的C#程序跑完就直接返回了Popen对象,而且默认不会把C#程序的控制台输出转发到Jupyter Notebook里,所以你看不到任何程序运行的迹象,误以为它没启动。 - 进程卡在等待输入:你的C#代码最后有
Console.ReadLine(),这会让程序停在那里等用户输入回车才会退出,但Python启动进程后没给它输入任何内容,导致进程在后台默默卡住,你完全看不到反馈。 - 虽然你尝试了带参数的列表写法,但因为前面两个问题没解决,所以依然看不到效果。
正确的实现方式
方式一:用subprocess.run同步执行(最推荐)
subprocess.run会自动等待进程执行完成,还能捕获输出,非常适合这种需要同步调用的场景:
import subprocess # 替换成你的exe绝对路径 exe_path = "C:/Users/duykh/source/repos/ConsoleApp2/ConsoleApp2/bin/Release/netcoreapp3.1/ConsoleApp2.exe" # 带参数的写法:把exe路径和参数放在同一个列表里 result = subprocess.run( [exe_path, "argumentexample"], capture_output=True, text=True, # 给程序传入回车,触发Console.ReadLine()让它正常退出 input="\n" ) # 打印程序的输出内容 print("程序输出:") print(result.stdout) # 如果有错误也能看到 print("错误信息:") print(result.stderr)
这里的几个关键参数:
capture_output=True:捕获程序的标准输出和错误输出text=True:把输出从字节转换成字符串,方便直接打印input="\n":模拟用户输入回车,解决C#程序卡住的问题
方式二:用subprocess.Popen异步执行(适合需要后台运行的场景)
如果你需要让程序在后台跑,之后再处理输出,可以用Popen,但要手动处理输入和等待:
import subprocess exe_path = "C:/Users/duykh/source/repos/ConsoleApp2/ConsoleApp2/bin/Release/netcoreapp3.1/ConsoleApp2.exe" # 启动进程,同时捕获输出 proc = subprocess.Popen( [exe_path, "argumentexample"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, stdin=subprocess.PIPE # 允许给进程输入内容 ) # 给进程输入回车,让它结束等待 proc.stdin.write("\n") proc.stdin.flush() # 等待进程完成,获取输出 stdout, stderr = proc.communicate() print("程序输出:") print(stdout) print("错误信息:") print(stderr)
额外提醒
- 确保你的exe路径是绝对路径,避免相对路径导致的找不到文件问题。
- 如果你的.NET Core程序是框架依赖部署的(不是自包含),直接运行exe可能会报错,这时候需要用
dotnet命令来启动:
result = subprocess.run( ["dotnet", exe_path, "argumentexample"], capture_output=True, text=True, input="\n" )
内容的提问来源于stack exchange,提问作者Capt. Frost
相关产品推荐
相关产品推荐

