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

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