如何在.NET 9 C#控制台应用中调用带依赖的Python 3.12脚本并实现双向数据交互?
如何在.NET 9 C#控制台应用中调用带依赖的Python 3.12脚本并实现双向数据交互?
当然可以实现啦!你不需要用IronPython那种嵌入式的方案,直接借助.NET自带的Process类来启动Python进程就行——这种方式完美兼容你的虚拟环境和已安装的依赖包,步骤也很清晰:
第一步:先把Python依赖固化到requirements.txt里
你之前手动装了groq和python-dotenv,但没用到requirements.txt,现在把这些依赖导出到文件里,以后不管是重建环境还是部署都方便:
pip freeze > requirements.txt
这个命令会把当前虚拟环境里的所有包及其版本都写到requirements.txt里,以后要恢复依赖的话,直接跑pip install -r requirements.txt就行。
第二步:修改Python脚本,支持标准输入输出交互
你的app.py需要改成能从标准输入读取C#传递的内容,处理完后把结果输出到标准输出,这样C#才能捕获到结果。给你个示例:
import sys from groq import Groq from dotenv import load_dotenv import os # 加载环境变量 load_dotenv() def process_user_input(input_text): # 这里放你的业务逻辑,比如调用Groq API处理输入 client = Groq(api_key=os.getenv("GROQ_API_KEY")) completion = client.chat.completions.create( model="llama3-8b-8192", messages=[{"role": "user", "content": input_text}] ) return completion.choices[0].message.content if __name__ == "__main__": # 从标准输入读取C#传过来的内容 user_input = sys.stdin.read().strip() if user_input: # 处理输入并得到结果 result = process_user_input(user_input) # 把结果输出到标准输出,C#会读取这个 print(result)
第三步:在C#控制台应用里编写调用逻辑
用.NET的System.Diagnostics.Process类来启动Python进程,传递输入、捕获输出。示例代码如下:
using System; using System.Diagnostics; using System.Text; class Program { static void Main(string[] args) { // 从C#控制台获取用户输入 Console.Write("请输入要处理的内容:"); string userInput = Console.ReadLine(); // 配置Python进程的启动信息 var processStartInfo = new ProcessStartInfo { // 指定虚拟环境中的Python.exe路径(一定要用这个路径,才能用到你装的依赖) FileName = @".\env\Scripts\python.exe", // 指定要执行的Python脚本路径 Arguments = @".\app.py", // 开启输入、输出、错误的重定向,这样C#才能和Python交互 RedirectStandardInput = true, RedirectStandardOutput = true, RedirectStandardError = true, // 不显示Python的控制台窗口,保持C#控制台的整洁 UseShellExecute = false, CreateNoWindow = true, // 设置UTF8编码,避免中文乱码的坑 StandardOutputEncoding = Encoding.UTF8, StandardErrorEncoding = Encoding.UTF8 }; using (var pythonProcess = Process.Start(processStartInfo)) { // 把C#获取的用户输入传递给Python脚本 pythonProcess.StandardInput.WriteLine(userInput); pythonProcess.StandardInput.Close(); // 关闭输入流,告诉Python没有更多数据了 // 读取Python脚本返回的结果 string output = pythonProcess.StandardOutput.ReadToEnd(); // 读取错误信息(调试的时候很有用) string errorMsg = pythonProcess.StandardError.ReadToEnd(); // 等待Python进程执行完成 pythonProcess.WaitForExit(); // 在C#控制台显示结果 Console.WriteLine("\nPython脚本返回的结果:"); Console.WriteLine(output); // 如果有错误,打印出来排查问题 if (!string.IsNullOrEmpty(errorMsg)) { Console.WriteLine("\n执行过程中出现错误:"); Console.WriteLine(errorMsg); } } Console.WriteLine("\n按任意键退出..."); Console.ReadKey(); } }
几个要注意的小细节
- 路径问题:确保C#项目运行时的工作目录能找到
env文件夹和app.py,如果脚本在其他位置,记得写绝对路径,或者在ProcessStartInfo里设置WorkingDirectory属性指定脚本所在的文件夹。 - 虚拟环境不用手动激活:直接用
env\Scripts\python.exe启动进程,就会自动使用这个虚拟环境里的依赖包,不需要单独执行activate命令。 - 编码避坑:一定要设置UTF8编码,不然中文内容很容易出现乱码问题。
- 调试技巧:如果调用出问题,先单独运行Python脚本确认它能正常处理输入输出,再看C#捕获的错误信息来排查问题。
备注:内容来源于stack exchange,提问作者arman
相关产品推荐
相关产品推荐

