ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

IronPython使用

2022-02-07 14:58:35  阅读:245  来源: 互联网

标签:Python Broadcast C# 使用 scope IronPython public


最近一个项目,需要在WPF的页面中实现Python的调用,不用很复杂的Python模块,只使用原生的Python完成一些判断逻辑下的下单即可。

之前也做过类似的项目,但是那是在大神的领导的框架下实现的,为了能兼容Python的第三方模块的调用,使用了CPython,这个实现就很复杂了,具体的原理是在C++,Python和C#三个对象之间做了转换,最终是可以实现了,过程很复杂,需要修改Cpython的源码,这次没有大神的参与,需要自己实现,我选择了简单的IronPython,目前看是可以满足需求的。

使用IronPython就比较简单了,IronPython和C#之间天然就是可以互相调用的。查了一些使用方法之后,开始按照自己的需求实现,主要实现以下几种调用方式,符合我的使用需求,在满足一定的条件之后实现下单。

1,最简单的使用方式,在C#中执行Python的方法

Python脚本

@"results = list()

def GetResults():
    results.append('start')
    results.append('start')
    return  results

C#后台代码
            ScriptEngine engine = Python.CreateEngine();
            ScriptScope scope = engine.CreateScope();
            var sourceCode = engine.CreateScriptSourceFromString(formulaEditor.Text);
            sourceCode.Execute<object>(scope);

            1,直接使用results的列表
            var res = scope.GetVariable("results");
            IronPython.Runtime.List list = res as IronPython.Runtime.List;

            2,通过执行GetResults方法获取到results的结果
            var test = scope.GetVariable<Func<object>>("GetResults");
            object res = test();
            IronPython.Runtime.List list = res as IronPython.Runtime.List;

以上是两种获得返回值的方法,一种是调用方法,一中是直接使用List。

2,要在C#的窗体种执行完Python脚本,并且把结果实时输出到窗体中,我最后选择了事件的调用方式传递 

Python代码

def SetResults():
    Broadcast('Test')
    Broadcast('Start')
    Broadcast('Start')

C#代码

 private void EventTriggerWindow_Broadcast(string a)
        {
            Dispatcher.Invoke(() => { OutResults.Add(a); });
        }

        public delegate void BroadcastEventHander(string a);
        public event BroadcastEventHander Broadcast;

           ScriptEngine engine = Python.CreateEngine();
            ScriptScope scope = engine.CreateScope();
            var sourceCode = engine.CreateScriptSourceFromString(formulaEditor.Text);
            
            scope.SetVariable("Broadcast", Broadcast);
            sourceCode.Execute<object>(scope);
            var test = scope.GetVariable<Func<object>>("SetResults");
            Task.Run(() => { test(); });

通过事件Broadcast在Python中实时输入运行结果,现实到C#的窗体控件上

3,想要实现在C#中定义事件,然后在Python中触发事件,具体代码如下

Python脚本

def SendOrder(stkid):
    Broadcast(stkid)

def SetResults():
    Broadcast('Start')
    QuotationSource.Broadcast+=SendOrder
    QuotationSource.SubScribe('1000001')
    Broadcast('End')

C#代码

定义了一个类

 public class QuotationSource
    {
        public string StkId { get; set; }

        public QuotationSource()
        { }
        public void SubScribe(string stkId)
        {
            this.StkId = stkId;
        }

        public void OnTick()
        {
            if (Broadcast != null)
                Broadcast(StkId);
        }
        public delegate void BroadcastEventHander(string args);
        public event BroadcastEventHander Broadcast;
    }

点击按钮的时候触发事件

 private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            quotationSource.OnTick();
        }

ScriptEngine engine = Python.CreateEngine();
            ScriptScope scope = engine.CreateScope();
            var sourceCode = engine.CreateScriptSourceFromString(formulaEditor.Text);
            
            scope.SetVariable("QuotationSource", quotationSource);
            scope.SetVariable("Broadcast", Broadcast);
            sourceCode.Execute<object>(scope);
            var test = scope.GetVariable<Func<object>>("SetResults");
            Task.Run(() => { test(); });

这样就实现了Python中执行C#的事件触发

整体项目也会上传,代码写的比较乱,因为是个Demo我也没有整理

IronPython和C#交互-C#文档类资源-CSDN下载

标签:Python,Broadcast,C#,使用,scope,IronPython,public
来源: https://blog.csdn.net/xuweihgg/article/details/122808416

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有