You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:40:32