轉至: http://blog.csdn.net/hanghangaidoudou/article/details/70172162
python與C#的互相調用
一、C#調用python
新建一個項目,添加引用:IronPython.dll,Microsoft.Scripting.dll(在IronPython的安裝目錄中)。
創建一個文本文件命名為hello.py,把該文件添加的當前的項目中,並設置為總是輸出。
#hello.py
def welcome(name):
return "hello" + name
調用hello.py文件中的方法:
static void main(string[] args)
{
ScriptRuntime pyRunTime=Python.CreateRuntime();
dynamic obj=pyRunTime.UseFile("hello.py");
Console.Write(obj.welcome("Nick"));
Console.ReadKey();
}
二、Python調用C#
示例一:調用dll中的方法
1.先准備一個C#寫的dll,名稱為IronPython_TestDll.dll
using System;
using System.Collections.Generic;
using System.Text;
namespace IronPython_TestDll
{
public class TestDll
{
public static int Add(int x, int y)
{
return x + y;
}
}
public class TestDll1
{
private int aaa = 11;
public int AAA
{
get { return aaa; }
set { aaa = value; }
}
public void ShowAAA()
{
global::System.Windows.Forms.MessageBox.Show(aaa.ToString());
}
}
}
2.調用C#的dll中的方法
import clr
clr.AddReferenceByPartialName("System.Windows.Forms")
clr.AddReferenceByPartialName("System.Drawing")
from System.Windows.Forms import *
from System.Drawing import *
clr.AddReferenceToFile("IronPython_TestDll.dll")
from IronPython_TestDll import *
a=12
b=6
#靜態方法可以直接調用
c=TestDll.Add(a,b)
MessageBox.Show(c.ToString())
#普通方法需要先定義類
td=TestDll1()
td.AAA=100
td.ShowAAA()
示例二:動態執行python代碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using IronPython.Hosting;
namespace TestIronPython
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
PythonEngine scriptEngine = new PythonEngine();
//設定dll文件所在的目錄
scriptEngine.AddToPath(Application.StartupPath);
//textBox1.Text中寫的是python代碼,但調用的是dll中的方法
scriptEngine.Execute(textBox1.Text);
}
}
}
//textBox1.Text中寫的是如下代碼,會計算彈出100的提示框。
a=12
b=6
c=TestDll.Add(a,b)
MessageBox.Show(c.ToString())
td=TestDll1()
td.AAA=100
td.ShowAAA()
------------------------------------------------------------------------------------------------------------------------------------------------
前言:
在平時工作中,需求有多種實現方式;根據不同的需求可以采用不同的編程語言來實現。發揮各種語言的強項
如: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接口方式。