C#使用IronPython調(diào)用python代碼的實(shí)現(xiàn)示例
找不到os:已解決
os是python基礎(chǔ)包,這個(gè)都找不到實(shí)在很離譜。解法是在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);
...
此時(shí)報(bào)錯(cuò)消失。
invalid syntax:版本問題,未解決
C#中完整報(bào)錯(cuò):
引發(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。這個(gè)暫時(shí)沒法解決,所以我還是放棄在python中執(zhí)行了。
2021/8/27更新:c#執(zhí)行python的exe文件
這個(gè)的主要問題是慢。我的項(xiàng)目只用到matplotlib和biopython,所以通過創(chuàng)建虛擬環(huán)境,裝包,然后用pyinstaller打包的方式構(gòu)建可執(zhí)行文件。簡單測了一下,文件讀取然后繪制4w+點(diǎn)就花了10s多。。實(shí)在不能忍。所以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;
// 我的一個(gè)參數(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è)路徑,可能報(bào)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是一個(gè)幫助c#引用python代碼的插件/庫。但是,由于我的python代碼中用到matplotlib和biopython,而這兩個(gè)包都需要numpy,可是IronPython完全不支持numpy,所以我最終放棄了這個(gè)做法。因此本文只貼最最最簡單的例子。

環(huán)境
win10 + vs 2019 + netframework 4.7.2
實(shí)例
首先在工具-NuGet包管理器中搜索IronPython,安裝。我裝的版本是 2.7.11。
這里我第一次傻 了,因?yàn)镮ronPython 2.7.*就是python 2.7,IronPython 3.4才是python 3的。
然后在wpf項(xiàng)目里放一個(gè)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)容了。

當(dāng)前,只做簡單運(yùn)算、不引用其他包的py代碼是可以跑起來的,但是如果引用諸如os這種基礎(chǔ)包都會報(bào)錯(cuò),提示模塊不存在。那么,如果實(shí)在要用,應(yīng)該裝對應(yīng)的Python環(huán)境,然后把對應(yīng)路徑加到sys.path中來,那就是能跑的。
但是前面也說了,numpy用不了,而我的客戶都沒有python環(huán)境,我也不能強(qiáng)迫他們裝,所以只能采取別的方式了,下次再更新解決方案。
到此這篇關(guān)于C#使用IronPython調(diào)用python代碼的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)C# IronPython調(diào)用python內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# WinForms使用CyUSB.dll訪問USB設(shè)備的實(shí)現(xiàn)步驟
CYUSB.dll驅(qū)動包為C#開發(fā)者提供了便捷的USB設(shè)備操作解決方案,該驅(qū)動包內(nèi)含多個(gè)版本的cyusb.dll文件,滿足不同項(xiàng)目的需求,本文給大家介紹了C# WinForms使用CyUSB.dll訪問USB設(shè)備的實(shí)現(xiàn)步驟,需要的朋友可以參考下2025-09-09
C#實(shí)現(xiàn)生成mac地址與IP地址注冊碼的兩種方法
這篇文章主要介紹了C#實(shí)現(xiàn)生成mac地址與IP地址注冊碼的兩種方法,非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09
基于AForge實(shí)現(xiàn)C#攝像頭視頻錄制功能
這篇文章主要為大家詳細(xì)介紹了基于AForge實(shí)現(xiàn)C#攝像頭視頻錄制功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
C# WinForm調(diào)用Shell_NotifyIcon的示例代碼
這篇文章主要介紹了C# WinForm調(diào)用Shell_NotifyIcon的示例代碼,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2020-11-11
C#基于共享內(nèi)存實(shí)現(xiàn)跨進(jìn)程隊(duì)列
進(jìn)程通信一般情況下比較少用,但是也有一些使用場景,有些做視頻傳輸?shù)乃坪鯐枚噙M(jìn)程來實(shí)現(xiàn),還有在子進(jìn)程中調(diào)用特定的庫來避免內(nèi)存泄漏,筆者最近也遇到了需要使用多進(jìn)程的場景,本文介紹了C#基于共享內(nèi)存實(shí)現(xiàn)跨進(jìn)程隊(duì)列,需要的朋友可以參考下2024-07-07
WPF實(shí)現(xiàn)類似ChatGPT逐字打印效果的示例代碼
前一段時(shí)間ChatGPT類的應(yīng)用十分火爆,這類應(yīng)用在回答用戶的問題時(shí)逐字打印輸出,像極了真人打字回復(fù)消息,本文就來利用WPF模擬一下這種逐字打印的效果吧2023-08-08

