C#与Python交互方式
前言:
在平时工作中,需求有多种实现方式;根据不同的需求可以采用不同的编程语言来实现。发挥各种语言的强项
如: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.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文件:
调用:
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结果
总结:
通过以上内容知道各种语言平台想交互,虽然有多种方式实现;但是最为推荐还是提供Webapi接口方式。
C#与Python交互方式的更多相关文章
- 测试Python代码
作为程序员,懂得测试,这是必须的职业技能.很遗憾,我以前从未意识到这点,因此经历了很多叫苦不迭的开发生涯.当然了,期望每个人都成为测试高手也是不可能的,但是最基本的单元测试啥的是不惜的,尤其是现在中小 ...
- 在python中的使用Libsvm
http://blog.csdn.net/pipisorry/article/details/38964135 LIBSVM是台湾大学林智仁(LinChih-Jen)教授等开发设计的一个简单.易于使用 ...
- 从零开始学习PYTHON3讲义(二)把Python当做计算器
<从零开始PYTHON3>第二讲 上一讲我们说过了如何启动Python IDLE集成开发学习环境,macOS/Linux都可以在命令行执行idle3.Windows则从开始菜单中去寻找ID ...
- python与shell的3种交互方式介绍
[目录] 1.os.system(cmd) 2.os.popen(cmd) 3.利用subprocess模块 4.subprocessor模块进阶 [概述] 考虑这样一个问题,有hello.py脚本, ...
- python SSH客户端的交互式和非交互方式
使用python中有一个paramiko模块来实现python SSH客户端,与SSH服务器交互时,需要注意有交互式和非交互式的区别. 只执行单条命令,之后就断开链接,可以使用非交互方式.执行多条命令 ...
- Python与系统的交互方式
本节内容 os与commands模块 subprocess模块 subprocess.Popen类 总结 我们几乎可以在任何操作系统上通过命令行指令与操作系统进行交互,比如Linux平台下的shell ...
- 三,用户交互方式与python基本数据类型
一.与用户交互 input python2中:用户输入什么类型的数据,就储存为什么类型的数据.比如输入数字则储存为整型,输入符号则存储为字符串型.raw_input会将所有输入的类型转换为字符串型. ...
- Python学习--01入门
Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...
- Python小白的发展之路之Python基础(一)
Python基础部分1: 1.Python简介 2.Python 2 or 3,两者的主要区别 3.Python解释器 4.安装Python 5.第一个Python程序 Hello World 6.P ...
随机推荐
- [C#] 尝鲜.net6.0的C#代码热重载
看到.NET 6 Preview 1 发布,里面"除了 XAML 热重载之外,还将支持 C# 代码的热重载"一句,觉得有必要试试看,因为XAML热重载功能用起来确实很爽. 首先要下 ...
- Scrapy项目_苏宁图书信息
苏宁图书(https://book.suning.com/) 目标: 1.图书一级分类 2.图书二级分类 3.图书三级分类 4.图书名字 5.图书作者 6.图书价格 7.通过Scrapy获取以上数据 ...
- JDBC 连接Oracle数据库 各个对象的理解
JDBC: 1. **代码实现:(连接oracle数据库) 1.导入驱动jar包 2.注册驱动 Class.forName("oracle.jdbc.driv ...
- 如何用Eggjs从零开始开发一个项目(3)
上一篇中我们编写了用户注册登录.登录的代码,学习了如何进行用户的认证(JWT),如何安全地存储用的密码(hash).这一篇我们有以下2个任务: 获取token中的数据: 通过model来同步数据库. ...
- Java数组之选择排序
选择排序 package com.kangkang.array; import java.util.Arrays; public class demo04 { public static void m ...
- 使用Groovy构建DSL
DSL(Domain Specific Language)是针对某一领域,具有受限表达性的一种计算机程序设计语言. 常用于聚焦指定的领域或问题,这就要求 DSL 具备强大的表现力,同时在使用起来要简单 ...
- 从零搭建一个IdentityServer——单页应用身份验证
上一篇文章我们介绍了Asp.net core中身份验证的相关内容,并通过下图描述了身份验证及授权的流程: 注:改流程图进行过修改,第三方用户名密码登陆后并不是直接获得code/id_token/acc ...
- MarkFormat,一个在Word中使用Mark进行格式化的插件
MarkFormat(标记格式化),是一款在Word中基于标记进行格式化的工具. 让我们看下具体效果. 首先是有标记的文本 点击格式化之后 点击去除标记之后(去除标记也会进行格式化) 如果想要恢复标记 ...
- golang——net/rpc/jsonrpc包学习
1.jsonrpc包 该实现了JSON-RPC的ClientCodec和ServerCodec接口,可用于rpc包. 可用于跨语言使用go rpc服务. 2.常用方法 (1)func Dial(net ...
- LNMP配置——Nginx配置 ——Nginx防盗链
一.配置 #vi /usr/local/nginx/conf/vhost/test.com.conf 写入: server { listen 80; server_name test.com test ...