<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在平常工程專案開發過程中常常會涉及到機器學習、深度學習演演算法方面的開發任務,但是受限於程式設計語言本身的應用特點,該類智慧演演算法的開發任務常常使用Python語言開發,所以在工程實踐過程中常常會遇到多平臺程式部署問題。本文總結了C#呼叫Python程式的各種方法,希望能夠給各位讀者提供一定的參考。
使用c#,nuget管理包上下載的ironPython安裝包適用於python指令碼中不包含第三方模組的情況
IronPython 是一種在 NET 和 Mono 上實現的 Python 語言,由 Jim Hugunin(同時也是 Jython 創造者)所創造。它的誕生是為了將更多的動態語音移植到NET Framework上。
using IronPython.Hosting; using Microsoft.Scripting.Hosting; using System; namespace CSharpCallPython { class Program { static void Main(string[] args) { ScriptEngine pyEngine = Python.CreateEngine();//建立Python直譯器物件 dynamic py = pyEngine.ExecuteFile(@"test.py");//讀取指令碼檔案 int[] array = new int[9] { 9, 3, 5, 7, 2, 1, 3, 6, 8 }; string reStr = py.main(array);//呼叫指令碼檔案中對應的函數 Console.WriteLine(reStr); Console.ReadKey(); } } }
def main(arr): try: arr = set(arr) arr = sorted(arr) arr = arr[0:] return str(arr) except Exception as err: return str(err)
適用於python指令碼中包含第三方模組的情況(與第四種類似)
using System; using System.Collections; using System.Diagnostics; namespace Test { class Program { static void Main(string[] args) { Process p = new Process(); string path = "reset_ipc.py";//待處理python檔案的路徑,本例中放在debug資料夾下 string sArguments = path; ArrayList arrayList = new ArrayList(); arrayList.Add("com4"); arrayList.Add(57600); arrayList.Add("password"); foreach (var param in arrayList)//新增引數 { sArguments += " " + sigstr; } p.StartInfo.FileName = @"D:Python2python.exe"; //python2.7的安裝路徑 p.StartInfo.Arguments = sArguments;//python命令的引數 p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.Start();//啟動程序 Console.WriteLine("執行完畢!"); Console.ReadKey(); } } }
Python程式碼
# -*- coding: UTF-8 -*- import serial import time def resetIPC(com, baudrate, password, timeout=0.5): ser=serial.Serial(com, baudrate, timeout=timeout) flag=True try: ser.close() ser.open() ser.write("n".encode("utf-8")) time.sleep(1) ser.write("rootn".encode("utf-8")) time.sleep(1) passwordStr="%sn" % password ser.write(passwordStr.encode("utf-8")) time.sleep(1) ser.write("killall -9 xxxn".encode("utf-8")) time.sleep(1) ser.write("rm /etc/xxx/xxx_user.*n".encode("utf-8")) time.sleep(1) ser.write("rebootn".encode("utf-8")) time.sleep(1) except Exception: flag=False finally: ser.close() return flag resetIPC(sys.argv[1], sys.argv[2], sys.argv[3])
使用c++程式呼叫python檔案,然後將其做成動態連結庫(dll),在c#中呼叫此dll檔案
限制:實現方式很複雜,並且受python版本、(python/vs)32/64位元影響,而且要求使用者必須安裝python執行環境
使用安裝好的python環境,利用c#命令列,呼叫.py檔案執行(推薦使用)
優點:執行速度只比在python本身環境中慢一點,步驟也相對簡單
缺點:需要使用者安裝設定python環境
實用步驟:
1、下載安裝python,並設定好環境變數等(本人用的Anaconda,連結此處不再提供)
2、編寫python檔案(這裡為了便於理解,只傳比較簡單的兩個引數)
#main.py import numpy as np import multi import sys def func(a,b): result=np.sqrt(multi.multiplication(int(a),int(b))) return result if __name__ == '__main__': print(func(sys.argv[1],sys.argv[2])) 3、在c#中呼叫上述主python檔案:main.py private void Button_Click(object sender, RoutedEventArgs e) { string[] strArr=new string[2];//參數列 string sArguments = @"main.py";//這裡是python的檔案名字 strArr[0] = "2"; strArr[1] = "3"; RunPythonScript(sArguments, "-u", strArr); } //呼叫python核心程式碼 public static void RunPythonScript(string sArgName, string args = "", params string[] teps) { Process p = new Process(); string path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + sArgName;// 獲得python檔案的絕對路徑(將檔案放在c#的debug資料夾中可以這樣操作) path = @"C:UsersuserDesktoptest"+sArgName;//(因為我沒放debug下,所以直接寫的絕對路徑,替換掉上面的路徑了) p.StartInfo.FileName = @"D:Pythonenvspython3python.exe";//沒有配環境變數的話,可以像我這樣寫python.exe的絕對路徑。如果配了,直接寫"python.exe"即可 string sArguments = path; foreach (string sigstr in teps) { sArguments += " " + sigstr;//傳遞引數 } sArguments += " " + args; p.StartInfo.Arguments = sArguments; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.Start(); p.BeginOutputReadLine(); p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived); Console.ReadLine(); p.WaitForExit(); } //輸出列印的資訊 static void p_OutputDataReceived(object sender, DataReceivedEventArgs e) { if (!string.IsNullOrEmpty(e.Data)) { AppendText(e.Data + Environment.NewLine); } } public delegate void AppendTextCallback(string text); public static void AppendText(string text) { Console.WriteLine(text); //此處在控制檯輸出.py檔案print的結果 }
c#呼叫python可執行exe檔案,使用命令列進行傳參取返回值
優點:無需安裝python執行環境
缺點:
1、可能是因為要展開exe中包含的python環境,執行速度相當慢,慎用!
2、因為是命令列傳參形式,故傳參需要自行處理。ps:由於命令列傳參形式為:xxx.exe 引數1 引數2 引數3....
使用步驟:
1、使用pyinstaller打包python程式;
2、在c#中呼叫此exe檔案;
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45