C#使用IronPython調(diào)用python代碼的實現(xiàn)示例
找不到os:已解決
os是python基礎(chǔ)包,這個都找不到實在很離譜。解法是在paths中增加os的路徑。
首先在anaconda prompt中找到位置:
Python 3.9.13 (main, Aug 25 2022, 23:51:50) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path ... >>> import os >>> os <module 'os' from 'D:\\ProgramData\\Anaconda3\\lib\\os.py'> >>>
所以修改C#中調(diào)用部分:
... var paths = engine.GetSearchPaths(); paths.Add("C:\\Users\\xxxx\\.nuget\\packages\\ironpython\\3.4.1\\lib"); paths.Add("D:\\ProgramData\\Anaconda3\\lib"); // 這一句 engine.SetSearchPaths(paths); ...
此時報錯消失。
invalid syntax:版本問題,未解決
C#中完整報錯:
引發(fā)的異常:“Microsoft.Scripting.SyntaxErrorException”(位于 Microsoft.Dynamic.dll 中) “Microsoft.Scripting.SyntaxErrorException”類型的未經(jīng)處理的異常在 Microsoft.Dynamic.dll 中發(fā)生 invalid syntax
參考這里:
Invalid syntax · Issue #1501 · IronLanguages/ironpython3 · GitHub
https://github.com/IronLanguages/ironpython3/issues/1501
我這里的問題就是python的版本,本地是3.9但是IronPython裝的是3.4。這個暫時沒法解決,所以我還是放棄在python中執(zhí)行了。
2021/8/27更新:c#執(zhí)行python的exe文件
這個的主要問題是慢。我的項目只用到matplotlib和biopython,所以通過創(chuàng)建虛擬環(huán)境,裝包,然后用pyinstaller打包的方式構(gòu)建可執(zhí)行文件。簡單測了一下,文件讀取然后繪制4w+點就花了10s多。。實在不能忍。所以c#調(diào)用exe還是放棄吧。
DateTime beforeDT = System.DateTime.Now; string pyexePath = @"C:\XXXXXX\dist\drawGraph.exe"; Process p = new Process(); p.StartInfo.FileName = pyexePath; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardInput = true; p.StartInfo.CreateNoWindow = true; // 我的一個參數(shù) p.StartInfo.Arguments = @"C:\XXXX\XXX.txt"; p.Start(); string output = p.StandardOutput.ReadToEnd(); p.WaitForExit(); Console.WriteLine(output); DateTime afterDT = System.DateTime.Now; TimeSpan ts = afterDT.Subtract(beforeDT); Console.WriteLine("Time: {0}s", ts.TotalSeconds); p.Close();
C#調(diào)用python代碼和庫的幾種方法
使用IronPython,直接調(diào)用python文件
IronPython調(diào)用第三方庫需要裝庫、設(shè)路徑,可能報bug使用c++調(diào)用python,做成dll,在c#中調(diào)用dll
需要用戶安裝python環(huán)境,慢c#命令行調(diào)用py文件
需要用戶安裝python環(huán)境c#命令行調(diào)用python的exe文件
慢
先說結(jié)論
IronPython是一個幫助c#引用python代碼的插件/庫。但是,由于我的python代碼中用到matplotlib和biopython,而這兩個包都需要numpy,可是IronPython完全不支持numpy,所以我最終放棄了這個做法。因此本文只貼最最最簡單的例子。
環(huán)境
win10 + vs 2019 + netframework 4.7.2
實例
首先在工具-NuGet包管理器中搜索IronPython,安裝。我裝的版本是 2.7.11。
這里我第一次傻 了,因為IronPython 2.7.*就是python 2.7,IronPython 3.4才是python 3的。
然后在wpf項目里放一個mywindow.py文件,內(nèi)容為:
# -*- coding: utf-8 -*- import sys def text(): return str(sys.path)
調(diào)用的地方這樣寫:
using IronPython.Hosting; using Microsoft.Scripting.Hosting; public partial class WavePainter : Window { public WavePainter() { InitializeComponent(); //Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory); string basePath = AppDomain.CurrentDomain.BaseDirectory; string pyFilePath = basePath + @"..\..\py\mywindow.py"; ScriptRuntime pyRuntime = Python.CreateRuntime(); // 這里開始到dynamic py...行前都不是必須的。是指定lib path位置的 var engine = pyRuntime.GetEngine("python"); var pyScope = engine.CreateScope(); var paths = engine.GetSearchPaths(); paths.Add(basePath + @"..\..\packages\IronPython.2.7.11\lib"); engine.SetSearchPaths(paths); // 執(zhí)行py文件 dynamic py = pyRuntime.UseFile(pyFilePath); string a = py.text(); tb1.Text = a; } }
可以看到sys.path是真的加入內(nèi)容了。
當前,只做簡單運算、不引用其他包的py代碼是可以跑起來的,但是如果引用諸如os這種基礎(chǔ)包都會報錯,提示模塊不存在。那么,如果實在要用,應該裝對應的Python環(huán)境,然后把對應路徑加到sys.path中來,那就是能跑的。
但是前面也說了,numpy用不了,而我的客戶都沒有python環(huán)境,我也不能強迫他們裝,所以只能采取別的方式了,下次再更新解決方案。
到此這篇關(guān)于C#使用IronPython調(diào)用python代碼的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)C# IronPython調(diào)用python內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#?System.Linq提供類似SQL語法的高效查詢操作
System.Linq是C#的一個命名空間,提供了LINQ(語言集成查詢)功能,允許開發(fā)者使用一致的查詢語法來處理不同類型的數(shù)據(jù)源,如數(shù)組、集合、數(shù)據(jù)庫和XML等,本文介紹C#?System.Linq提供類似SQL語法的高效查詢操作,感興趣的朋友一起看看吧2024-09-09C#調(diào)用執(zhí)行外部程序的實現(xiàn)方法
這篇文章主要介紹了C#調(diào)用執(zhí)行外部程序的實現(xiàn)方法,涉及C#進程調(diào)用的相關(guān)使用技巧,非常簡單實用,需要的朋友可以參考下2015-04-04C#影院售票系統(tǒng)畢業(yè)設(shè)計(1)
這篇文章主要介紹了C#影院售票系統(tǒng)畢業(yè)設(shè)計,獻上了9個類的設(shè)計,需要的朋友可以參考下2015-11-11