详解c#与python的交互方式

作者:chaney1992 时间:2023-12-13 09:16:11 

目录
  • 前言:

  • 一、IronPython

  • 二、Python打包exe调用

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

  • 总结:

前言:

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

如: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)

执行结果:

详解c#与python的交互方式

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.7 和 3.3_3.5 配合使用,它通过透明压缩构建更小的可执行文件,它是完全多平台的,并使用操作系统支持来加载动态库,从而确保完整兼容性。
PyInstaller 的主要目标是与开箱即用的第三方软件包兼容。这意味着,使用 PyInstaller 时,所有使外部包正常工作所需的技巧都已集成到 PyInstaller 本身中,因此无需用户干预。您永远不需要在 wiki 中查找技巧,并将自定义修改应用于文件或设置脚本。例如,像PyQt、Django或matplotlib这样的库完全支持,而无需手动处理插件或外部数据文件。 

安装:

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


pip install pyinstaller

打包:


//命令格式
pyinstaller 选项 Python 源文件

选项参数支持以下内容:

参数描述
-H, -help查看帮助文档
-F,-onefile产生单个的可执行文件
-D,--onedir产生一个目录(包含多个文件)作为可执行程序
-a,--ascii不包含 Unicode 字符集支持
-d,--debug产生 debug 版本的可执行文件
-w,--windowed,--noconsolc指定程序运行时不显示命令行窗口(仅对 Windows 有效)
-c,--nowindowed,--console指定使用命令行窗口运行程序(仅对 Windows 有效)
-o DIR,--out=DIR指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件
-p DIR,--path=DIR设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。也可使用路径分隔符(Windows 使用分号,Linux 使用冒号)来分隔多个路径
-n NAME,--name=NAME指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字

最后在命令行中执行命令:

pyinstaller -F calc.py

打包完成后,生成calc.exe文件:

详解c#与python的交互方式

 调用:


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结果

详解c#与python的交互方式

总结:

通过以上内容知道各种语言平台想交互,虽然有多种方式实现;但是最为推荐还是提供Webapi接口方式。

来源:https://www.cnblogs.com/cwsheng/p/14673491.html

标签:c#,python
0
投稿

猜你喜欢

  • java 读写文件[多种方法]

    2022-10-04 09:09:00
  • Java中i++与++i的区别和使用

    2022-03-20 18:08:18
  • dubbo将异常转换成RuntimeException的原因分析 ExceptionFilter

    2023-11-24 14:25:13
  • Spring Security添加验证码的两种方式小结

    2021-08-05 17:24:25
  • Java Spring框架的注解式开发你了解吗

    2022-12-14 23:43:18
  • Android基于OpenGL在GLSurfaceView上绘制三角形及使用投影和相机视图方法示例

    2023-06-08 03:59:42
  • C语言预处理预编译命令及宏定义详解

    2023-06-18 16:28:06
  • Android Studio 打包生成APK文件方法

    2023-06-11 23:46:51
  • java中的类为什么只能用public修饰?

    2023-10-09 20:23:54
  • Java多线程Future松获取异步任务结果轻松实现

    2022-11-22 15:49:38
  • Java/Web调用Hadoop进行MapReduce示例代码

    2023-09-01 05:05:50
  • java多线程复制文件的实例代码

    2022-03-04 04:29:54
  • 听说用了YYYY-MM-dd的程序员,前些天都在加班改Bug

    2023-07-05 17:48:00
  • RecyclerView实现侧滑拖拽功能

    2023-03-10 16:09:50
  • vista和win7在windows服务中交互桌面权限问题解决方法:穿透Session 0 隔离

    2021-06-16 04:05:47
  • java面试题之try中含return语句时代码的执行顺序详解

    2023-11-24 07:34:16
  • JAVA对象和字节数组互转操作

    2022-05-06 22:57:28
  • 使用logback屏蔽一些包的日志

    2023-08-08 20:46:20
  • java前后端加密解密crypto-js的实现

    2023-11-29 12:09:31
  • 如何使用Java调用Linux系统命令

    2021-12-24 20:45:31
  • asp之家 软件编程 m.aspxhome.com