C#编程,C#与Python交互方式的实现

本文详细介绍了C#与Python之间交互的三种方法:使用IronPython、将Python打包为exe以及通过Python提供WebAPI接口。 IronPython允许在.NET环境中运行Python代码,但支持的库有限。将Python打包成exe可以解决第三方库问题,而通过WebAPI,Python可以作为服务供C#调用,实现更灵活的交互。
摘要由CSDN通过智能技术生成

原文:https://www.cnblogs.com/cwsheng/p/14673491.html

前言:

在平时工作中,需求有多种实现方式;根据不同的需求可以采用不同的编程语言来实现。发挥各种语言的强项

如:Python的强项是:数据分析、人工智能等,.NET 开发桌面程序界面比Python更简单、方便、美观

那么就存在各种语言间交互,本篇主要介绍几种C# 与 Python的交互方式。

一、IronPython

1、IronPython是什么?

IronPython是Python编程语言的开源实现,该语言与.NET Framework紧密集成。IronPython可以使用.NET
Framework和Python库,而其他.NET语言也可以轻松使用Python代码。

2、IrconPython如何使用

a) 添加包引用:

Install-Package IronPython -Version 2.7.11

b) 执行简单python脚本:

//创建执行引擎
ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = engine.CreateScope();
string script = "'Hello %d' %number";
//设置参数列表
scope.SetVariable("number", 123);
ScriptSource sourceCode = engine.CreateScriptSourceFromString(script);
var result = sourceCode.Execute<object>(scope);

c) 执行python文件方法:
添加如下简单Python文件:demo.py

#文件目录 demo.py
import time

def welcome(name):
    return "hello " + name

def Add(a, b):
    return a + b

def showMsg(name,birthday):
    return "姓名:" + name + ",生日:" + birthday

执行方法:

string path = @"demo.py";
ScriptRuntime pyRuntime = Python.CreateRuntime(); //创建一下运行环境
dynamic obj = pyRuntime.UseFile(path);
//调用python中Add函数
object sum = obj.Add(1, 54);

d) 执行python文件方法(依赖三方库):

from scipy import linalg
import numpy as np
import json

def calcnum(jsonInput):
    A = np.array([[1, 1, 7], [2, 3, 5], [4, 2, 6]])  # A代表系数矩阵
    b = np.array([2, 3, 4])  # b代表常数列
    x = linalg.solve(A, b)
    # json字符串转对象
    info = json.loads(jsonInput)
    print(info['a'])
    # 对象转json字符串
    output = json.dumps(info)
    print(output)
    print(x)

IronPython虽然能够交互Python,但支持的库不多,当py文件依赖三方库,则会调用失败;且IronPython对Python3尚未完全支持,下面就开始在C#在Python有第三方库的情况下交互Python。

二、Python打包exe调用

把Python打包成exe,C#再通过cmd进行交互。就可以解决第三方库的问题;

修改Python文件(calc.py):依赖了scipy库

from scipy import linalg
import numpy as np
import json

def calcnum(jsonInput):
    A = np.array([[1, 1, 7], [2, 3, 5], [4, 2, 6]])  # A代表系数矩阵
    b = np.array([2, 3, 4])  # b代表常数列
    x = linalg.solve(A, b)
    # json字符串转对象
    info = json.loads(jsonInput)
    print(info['a'])
    # 对象转json字符串
    output = json.dumps(info)
    print(output)
    print(x)


if __name__ == '__main__':
    inputString = sys.argv[1]
    calcnum(inputString)

Pyinstaller:

PyInstaller 是一个程序,将(包)Python 程序打包到独立的可执行文件中,在 Windows、Linux、Mac OS X、FreeBSD、Solaris 和 AIX 下。与类似工具不同,它的主要优点是 PyInstaller 可以与 Python 2.73.3_3.5 配合使用,它通过透明压缩构建更小的可执行文件,它是完全多平台的,并使用操作系统支持来加载动态库,从而确保完整兼容性。
PyInstaller 的主要目标是与开箱即用的第三方软件包兼容。这意味着,使用 PyInstaller 时,所有使外部包正常工作所需的技巧都已集成到 PyInstaller 本身中,因此无需用户干预。您永远不需要在 wiki 中查找技巧,并将自定义修改应用于文件或设置脚本。例如,像PyQt、Django或matplotlib这样的库完全支持,而无需手动处理插件或外部数据文件。 

安装:
在Cmd命令行中运行:需提前安装pip(python3.4以后默认包含)

pip install pyinstaller

打包:

pyinstaller 选项 Python 源文件

在这里插入图片描述
最后在命令行中执行命令:

pyinstaller -F calc.py

调用

private string Calc(string inputString)
{
    // 调用python脚本
    Process p = new Process();
    p.StartInfo.FileName = "calc.exe";
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.RedirectStandardInput = true;
    p.StartInfo.CreateNoWindow = true;
    // 注意,这前面得有一个空格,不然就连在一起了
    p.StartInfo.Arguments = " " + inputString;
    p.Start();
    string output = p.StandardOutput.ReadToEnd();
    p.WaitForExit();
    p.Close();  return output;
}

到此该方法已能成功调用Python结果

三、Python提供WebApi接口(推荐)

使用Python中flask库实现一个简单的webapi服务:

from flask import Flask, request
import Math
app = Flask(__name__)

@app.route("/")
def welcome():
    return "Hello World!"

@app.route("/calc")
def calc():
    strinput = request.args.get("jsonInput")
    return Math.calcnum(strinput)

if __name__ == "__main__":
    app.run()

最后在C#中调用webapi:得到python结果在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C#中与Python进行交互有几种方式,以下是两种常用的方式: 1. 使用IronPython:IronPython是一个在.NET平台上运行的Python解释器,可以与C#无缝集成。你可以通过NuGet包管理器将IronPython添加到你的C#项目中,并使用它来执行Python代码、调用Python模块和访问Python对象。下面是一个简单的示例: ```csharp using IronPython.Hosting; using IronPython.Runtime; // 创建Python引擎 var engine = Python.CreateEngine(); // 执行Python代码 engine.Execute("print('Hello from Python!')"); // 调用Python函数 dynamic pythonFunction = engine.Execute("def add(a, b):\n return a + b"); dynamic result = pythonFunction.add(3, 4); Console.WriteLine(result); // 输出:7 ``` 2. 使用Python的进程间通信:你可以在C#中启动一个Python进程,并通过标准输入输出进行通信。这个方法可以更灵活地与Python交互,但需要手动处理进程通信。下面是一个简单的示例: ```csharp using System.Diagnostics; // 创建Python进程 var processInfo = new ProcessStartInfo { FileName = "python", Arguments = "sample_script.py", // Python脚本的路径 RedirectStandardInput = true, RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true }; var process = Process.Start(processInfo); // 向Python进程发送输入 process.StandardInput.WriteLine("print('Hello from Python!')"); process.StandardInput.WriteLine("x = 3"); process.StandardInput.WriteLine("y = 4"); process.StandardInput.WriteLine("print(x + y)"); // 从Python进程接收输出 string output = process.StandardOutput.ReadToEnd(); Console.WriteLine(output); // 输出Python的输出 // 等待Python进程结束 process.WaitForExit(); // 关闭进程 process.Close(); ``` 请注意,这只是两种常见的方法之一,还有其他方法可供选择。选择哪种方式取决于你的具体需求和项目的要求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值