目录

一、简介

 二、创建 C# 项目

三、C# 调用 Python

1.IronPython 插件

2.调用 python 文件执行

3.调用 python exe 程序执行

结束


一、简介

IronPython 是一种在 NET 和 Mono 上实现的 Python 语言,由 Jim Hugunin(同时也是 Jython 创造者)所创造。
Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。
Python是一种解释型脚本语言,可以应用于以下领域:
● 科学计算和统计
● 人工智能
● 桌面界面开发
● 软件开发
● 后端开发
● 网络爬虫

 二、创建 C# 项目

新建一个 Winform 项目 CSharpCallPython

为了更方便的看到控制台打印的效果,在 项目属性 --> 应用程序 将输出类型改为控制台输出

三、C# 调用 Python

1.IronPython 插件

在 NuGet 中安装 IronPython 插件

在项目的 Debug 目录下添加一个 Python 脚本 test.py ,

在 test.py 中添加下面的代码:

def sayHi():
    print("f**k you")
    
def add(x,y):
    try:
        return x + y
    except Exception as err:
        return str(err)
        
def arrSum(arr):
    try:
        sum = 0
        for i in arr:
            sum += i
        return sum
    except Exception as err:
        return str(err)

此时,Python 的工作就完成了,接下来我们继续完成 C# 剩余的逻辑。

Winform 界面只需要添加一个按钮即可

Form1 代码:

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System;
using System.Windows.Forms;

namespace CSharpCallPython
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private string PythonScriptPath = string.Empty;
        private ScriptEngine PyEngine = null;

        private void Form1_Load(object sender, EventArgs e)
        {
            PythonScriptPath = Application.StartupPath + "\\test.py";

            PyEngine = Python.CreateEngine();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            dynamic py = PyEngine.ExecuteFile(PythonScriptPath);
            py.sayHi();

            var sum = py.add(3, 5);
            Console.WriteLine("add 方法的和是:{0}", sum);

            int[] arr = new int[3] { 2, 4, 6 };
            var sum1 = py.arrSum(arr);
            Console.WriteLine("数组的和是:{0}", sum1);
        }

    }
}

运行后,点击按钮后效果:

2.调用 python 文件执行

从 C# 中确实可以直接调用 python 文件执行,上节中使用了  IronPython 插件,只能执行一些简单的代码,大部分时候,C# 调用 python,主要是 python 有很多好用的库,而  IronPython 插件对 python 的库不是很友好。

要实现这个功能,需要提前在 IDE 中提前写好代码,我使用的 IDE 是 PyCharm Community Edition 2024.1

python 文件:

import argparse
import time

# description 参数为该脚本添加了描述
parser = argparse.ArgumentParser(description='test csharp call python')
# --name: 参数的名称,使用时需要带上双横线
# type=str: 参数的类型,这里指定为字符串
# default="0": 如果用户没有提供该参数,则使用默认值 "0"
# help='input name': 提供该参数的帮助信息
parser.add_argument("--name", type=str, default="0", help='input name')
# type=int: 参数的类型,这里指定为整数
parser.add_argument("--age", type=int, default=32,help='input total age')
args = parser.parse_args()

print(f"Name:{args.name}")
print(f"Age:{args.age}")

# 休眠,这么写 C# 这边会等代码执行完成然后一起返回
# time.sleep(5)
# print('休眠5秒')

C# 代码:

文件夹的路径自己改下

using System;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;
 
namespace CSharpCallPython
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Task.Run(() => Test());
        }
 
        private void Test()
        {
            ProcessStartInfo start = new ProcessStartInfo();
            //设置 Python 解释器路径
            start.FileName = "E:\\xxx\\xxx\\.venv\\Scripts\\python.exe";
            //设置要执行的 Python 脚本路径及其参数
            start.Arguments = "E:\\xxx\\xxx\\test.py --name 'John' --age 25";
 
            start.UseShellExecute = false;
            start.RedirectStandardOutput = true;
            start.RedirectStandardError = true;
 
            using (Process process = Process.Start(start))
            {
                string output = process.StandardOutput.ReadToEnd();
                string error = process.StandardError.ReadToEnd();
                // 等待进程结束
                process.WaitForExit();
 
                Console.WriteLine("python:\n{0}", output);
                Console.WriteLine("错误:\n{0}", error);
            }
        }
    }
}

运行:

3.调用 python exe 程序执行

需要在 PyCharm Community Edition 将 python 文件编译成 exe 文件,python 脚本就用上节的 python 代码,用法整体上就那样。

先得安装一个库:

pip install pyinstaller 

然后编译:

pyinstaller --onefile test.py 

--onefile 选项会将所有依赖打包到一个单独的可执行文件中

test.py 是你 python 脚本的名字 

C# 代码:

FileName 是用 python 生成的 exe 文件路径

Arguments 这里是需要传值的参数

ProcessStartInfo processStartInfo = new ProcessStartInfo
{
    FileName = $"{Application.StartupPath}\\test.exe",
    Arguments = $"--name alang --age 45",
    RedirectStandardOutput = true,  
    RedirectStandardError = true,  
    UseShellExecute = false,        
    CreateNoWindow = true   
};

using (Process process = new Process())
{
    process.StartInfo = processStartInfo;
    process.Start();

    string output = process.StandardOutput.ReadToEnd();
    string error = process.StandardError.ReadToEnd();

    process.WaitForExit();

    Console.WriteLine("python:\n{0}", output);
    Console.WriteLine("错误:\n{0}", error);
}

结束

如果这个帖子对你有所帮助,欢迎 关注 + 点赞 + 留言

end

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐