C#使用IronPython調用python代碼的實現示例
找不到os:已解決
os是python基礎包,這個都找不到實在很離譜。解法是在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#中調用部分:
...
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”類型的未經處理的異常在 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打包的方式構建可執(zhí)行文件。簡單測了一下,文件讀取然后繪制4w+點就花了10s多。。實在不能忍。所以c#調用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;
// 我的一個參數
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#調用python代碼和庫的幾種方法
使用IronPython,直接調用python文件
IronPython調用第三方庫需要裝庫、設路徑,可能報bug使用c++調用python,做成dll,在c#中調用dll
需要用戶安裝python環(huán)境,慢c#命令行調用py文件
需要用戶安裝python環(huán)境c#命令行調用python的exe文件
慢
先說結論
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文件,內容為:
# -*- coding: utf-8 -*- import sys def text(): return str(sys.path)
調用的地方這樣寫:
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是真的加入內容了。

當前,只做簡單運算、不引用其他包的py代碼是可以跑起來的,但是如果引用諸如os這種基礎包都會報錯,提示模塊不存在。那么,如果實在要用,應該裝對應的Python環(huán)境,然后把對應路徑加到sys.path中來,那就是能跑的。
但是前面也說了,numpy用不了,而我的客戶都沒有python環(huán)境,我也不能強迫他們裝,所以只能采取別的方式了,下次再更新解決方案。
到此這篇關于C#使用IronPython調用python代碼的實現示例的文章就介紹到這了,更多相關C# IronPython調用python內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C#?System.Linq提供類似SQL語法的高效查詢操作
System.Linq是C#的一個命名空間,提供了LINQ(語言集成查詢)功能,允許開發(fā)者使用一致的查詢語法來處理不同類型的數據源,如數組、集合、數據庫和XML等,本文介紹C#?System.Linq提供類似SQL語法的高效查詢操作,感興趣的朋友一起看看吧2024-09-09

